KMP算法-极客
- 从上面博客中学到的最关键一点就是
next
数组的第i位代表,前i项中,前缀与后缀相等的最大长度,举个例子,如字符串abab
的next
数组应该是
- 附上看完博客后自己的实现,找到模板串在原始串中出现的次数
#include<bits/stdc++.h>
using namespace std;
const int N = 1000;
int main(){
int i = 1, j = 0;
char s[N], p[N];
cin >> s+1 >> p+1;
int next[N]={0};
int len = strlen(p);
while(i < len){
if(j == 0 || p[i] == p[j]){
next[i] = j;
i++, j++;
}
else j = next[j];
}
len = strlen(s);
i = 1, j = 0;
int cnt = 0;
while(i < len){
if(j==0 || s[i] == p[j+1]) i++,j++;
else j = next[j];
if(j == strlen(p)-1) cnt++;
}
cout << cnt << endl;
system("pause");
}
延申题目
- 判断一个字符串是否由自身的一个子串重复形成,如
ABABAB
是由AB
组成,如果是,那么输出AB3
,如果不是,那么输出-1
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int main(){
char s[N];
cin >> s+1;
int n = strlen(s+1);
int i = 1, j = 0;
int next[N]={0};
while(i<=n){
if(j==0 || s[i] == s[j]) {
next[i] = j;
i++,j++;
}
else{
j = next[j];
}
}
cout << next[n-1] << endl;
int startpos = n - 1 - next[n-1];
if(n%startpos) cout << "-1" << endl;
else{
for(int x=1;x<=startpos;x++) cout << s[x];
cout << n/startpos << endl;
}
system("pause");
}