利用有限自动机进行字符串匹配

字符串匹配算法有四种:

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 */

 

具体理论知识可以参考算法导论。

posted @ 2012-08-15 11:00  pushing my way  阅读(664)  评论(0编辑  收藏  举报