KMP字符匹配算法
上个假期就学了KMP,但是基本不用,所以忘干净了。。。这个的核心思想就是next数组,next数组学名叫最长相同前缀后缀。还不错的算法,KMP
匹配的过程中比原来的暴力匹配多了一个跳来跳去的next。
下面有一个链接:从头到尾KMP,写的很棒,很好懂!
贴板子代码:(自己写的注释,有可能不对,欢迎指出)
#include<cstdio> #include<cmath> #include<cstring> using namespace std; int next[1000005]; char s[1000005];//s为匹配串 char t[1000005];//t为文本串 int ans[1000005];//记录答案 int main() { scanf("%s%s",t + 1,s + 1);//从1开始存 int ls = strlen(s + 1); int lt = strlen(t + 1); int k = 0;//k为所匹配到的最大的后缀 next[1] = 0; for(int i = 2;i <= ls;i++)//开始匹配s,建next数组 { while(k != 0&&s[i] != s[k + 1]) //后缀不相等则回到next[k] k = next[k]; if(s[i] == s[k + 1])k++; //后缀相等 next[i] = k; } k = 0; int num = 0; for(int i = 1;i <= lt;i++)//开始匹配文本串 { while(k != 0&&t[i] != s[k + 1]) k=next[k]; if(t[i] == s[k + 1])k++; if(k == ls)//如果文本串中都已经匹配到s了,记录答案 { num++; ans[num] = i - ls + 1; } } for(int i = 1;i <= num;i++) printf("%d\n",ans[i]); for(int i = 1;i <= ls;i++) printf("%d ",next[i]);//输出答案 return 0; }
只想找一个不会伤害我的人