首页 > 编程语言 > 详细

字符串匹配,KMP算法

时间:2019-03-13 15:23:21      阅读:167      评论:0      收藏:0      [点我收藏+]

KMP的详解见:https://segmentfault.com/a/1190000008575379

主要难点在于Next数组的理解,KMP是不需要回溯的匹配算法。

 1 #include<iostream>
 2 #include<string>
 3 #include<vector>
 4 #define MAXSIZE 100
 5 using namespace std;
 6 /*为方便理解算法,使用全局变量减少参数传递*/
 7 string T,P;
 8 vector<int> Next(MAXSIZE);
 9 
10 void getNext();//获取带匹配字符串P的Next数组 
11 int KMP();//返回匹配结果,若P为T的子串则返回匹配成功的T的下标,反之返回-1 
12 
13 int main()
14 {
15     cout<<"Text : ";
16     getline(cin,T);//读取整行字符串,包括空格 
17     cout<<"Part : ";
18     getline(cin,P);
19     int index=KMP();
20     printf("index = %d\n",index);
21     return 0;
22 }
23 
24 int KMP()
25 {
26     int i=0,j=0;
27     int n=T.size(), m=P.size();//s.size()的返回值是unsigned类型,必须转为整型变量 
28     getNext();
29     while(i<n&&j<m){
30         if(j==-1||T[i]==P[j]){
31             i++;
32             j++;
33         }
34         else{
35             j=Next[j];
36         }
37 //        printf("i=%d, j=%d\n",i,j); //用于查看匹配过程 
38     }
39     
40     if(j==m) return i-j;
41     else return -1;
42 }
43 
44 void getNext()
45 {
46     int i=0,j=-1;
47     Next[0]=-1;
48     while(i<P.size()-1){
49         if(j==-1||P[i]==P[j]){
50             i++;
51             j++;
52         //    Next[i]=j; 
53             if(P[i]!=P[j]||j==0)
54                 Next[i]=j;
55             else
56                 Next[i]=Next[j];
57         }
58         else{
59             j=Next[j];
60         }
61     }
62 }

 

字符串匹配,KMP算法

原文:https://www.cnblogs.com/yinhao-ing/p/10523233.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!