【再不除草就晚了】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 }