疑问
暂无
代码
#include<cstdio>
#include<cstring>
const int maxn = 1010;
char pattern[maxn];
char text[maxn];
int nextVal[maxn];
void getNextVal(char s[],int len){
int j = -1;
nextVal[0] = -1;
for(int i=1;i<len;++i){
while(j != -1 && s[i] != s[j+1]){
j = nextVal[j];
}
if(s[i] == s[j+1]){
j++;
}
if(j == -1 || s[i+1] != s[j+1]){
nextVal[i] = j;
}else{
nextVal[i] = nextVal[j];
}
}
}
int KMP(char text[],char pattern[]){
int j = -1;
int ans = 0;
int len = strlen(text);
int m = strlen(pattern);
getNextVal(pattern,m);
for(int i=0;i<len;i++){
while(j != -1 && text[i] != pattern[j+1]){
j = nextVal[j];
}
if(text[i] == pattern[j+1]){
j++;
}
if(j == m-1){
ans++;
j = -1;
}
}
return ans;
}
int main(){
//字符数组赋予初值可以这样写,但是只能在声明时这样写。
char end[2] = "#";
while(scanf("%s",text),strcmp(text,end)){
scanf("%s",pattern);
int ans = KMP(text,pattern);
printf("%d\n",ans);
}
return 0;
}
反思
while(scanf("%s",text),strcmp(text,end))
这句代码我纠结了很久,不知道怎么来判断输入结束;- 这题的KMP算法注意一点,就是在匹配成功后,模式串的指针不是滑到上一个最大匹配的位置,而是直接重新匹配(即 j = - 1);