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

字符串匹配算法有四种:

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

 

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

你可能感兴趣的:(字符串)