利用有限自动机进行字符串匹配
字符串匹配算法有四种:
1.朴素算法,预处理O(0),匹配时间O((n-m+1)m) 其中n是文本长度,m是模式长度
2.Rabin-Karp算法,预处理O(m),匹配时间同朴素算法
3.有限自动机算法,预处理O(m|∑|),匹配时间O(n)
4.KMP算法,预处理O(m),匹配时间O(n)
这里讨论的是有限自动机算法,先给出预处理为O(m^3|∑|),匹配时间为O(n)的算法。
代码:
View Code
1 #include <iostream> 2 #include <string> 3 #include <stdio.h> 4 using namespace std; 5 string str="abc"; 6 string t,p; 7 int res[8][3]; 8 9 void transition() //O(m^3*|all|) 10 { 11 int m=p.size(); 12 int n=str.size(); 13 int q,i,j,k; 14 for(q=0;q<=m;q++) 15 for(i=0;i<n;i++) 16 { 17 k=min(m+1,q+2); 18 for(k=k-1;k>=0;k--) 19 { 20 if(k==0) 21 break; 22 if(p[k-1]!=str[i]) 23 continue; 24 for(j=0;j<=k-2;j++) 25 if(p[j]!=p[j+q-k+1]) 26 break; 27 if(j==k-1) 28 break; 29 } 30 res[q][i]=k; 31 //cout<<q<<" "<<i<<" "<<k<<endl; 32 } 33 34 // for(i=0;i<=m;i++) 35 // { 36 // for(j=0;j<3;j++) 37 // cout<<res[i][j]<<" "; 38 // cout<<endl; 39 // } 40 } 41 42 void match() 43 { 44 int n=t.size(); 45 int m=p.size(); 46 int i; 47 int q=0; 48 for(i=0;i<n;i++) 49 { 50 q=res[q][t[i]-'a']; //这里应该哈希处理 51 cout<<t[i]<<" "<<q<<endl; 52 if(q==m) 53 printf("start at %d\n",i+1-m); //这里输出所有的匹配 54 } 55 } 56 57 int main() 58 { 59 str="abc"; 60 cin>>p>>t; 61 transition(); 62 match(); 63 return 0; 64 } 65 66 /* 67 ababaca abababacabababacab 68 */
具体理论知识可以参考算法导论。