【再不除草就晚了】kmp算法

发现自己连kmp都忘了,是时候整理一波字符串算法了。

kmp思路:求next数组 next[j]表示当前匹配的位置的后缀正好与s[0]---s[next[j]]相同,在j处失配后下次比较的应该是next[j-1]+1;

求next数组思路:next[i-1]推倒,如果s[i]==s[(j=next[i-1]+1)] next[i]=next[i-1]+1 否则就找一个更短的前缀j=next[i-1];

推荐一篇博文:http://blog.csdn.net/u011564456/article/details/20862555?utm_source=tuicool&utm_medium=referral

放上代码

 1 int work(char a[])
 2 {
 3     int re=0,i,j,la=strlen(a),lt=strlen(t);
 4     Next[0]=-1;
 5     //printf("%d",la);
 6     for(i=1;i<la;i++)
 7     {
 8         j=Next[i-1];
 9         while(a[j+1]!=a[i]&&j>=0)
10         j=Next[j];
11         if(a[j+1]==a[i])
12         Next[i]=j+1;
13         else
14         Next[i]=-1;
15     }
16     i=0,j=0;
17     while(i<lt&&j<la)
18     {
19         if(t[i]==a[j])
20         {
21             i++;
22             j++;
23         }
24         else
25         {
26             if(j==0)
27             i++;
28             else
29             j=Next[j-1]+1;    
30         }
31         if(j>=la)
32         {
33             re++;
34             j=Next[j-1]+1;
35         }
36     }
37     return re;//返回值是a在t中出现次数
38 }

 

posted @ 2017-04-11 09:20  岚之川  阅读(133)  评论(0编辑  收藏  举报