题目描述
知识点
KMP
实现
码前思考
- 这道题就是进行字符串匹配问题。但是需要特别注意需要防止在
text
中找到pattern
匹配的情况
代码实现
//此题应该就是字符串的匹配问题
#include <cstdio>
#include <cstring>
const int maxn = 5e4+10;
int nex[maxn];
char text[maxn];
char pattern[maxn];
void getNex(){
int len = strlen(pattern);
nex[0] = -1;
int j = -1;
for(int i=1;i<len;i++){
while(j!=-1&&pattern[i]!=pattern[j+1]){
j = nex[j];
}
if(pattern[i] == pattern[j+1]){
j++;
}
nex[i]=j;
}
}
int main(){
while(scanf("%s",pattern)!=EOF && scanf("%s",text)){
getNex();
//开始进行匹配
int m = strlen(text);
int n = strlen(pattern);
int j = -1;
for(int i=0;i<m;i++){
if(j == m-1){
//如果完全匹配,那么需要进行回退
j=nex[j];
}
while(j != -1 && text[i] != pattern[j+1]){
j = nex[j];
}
//需要进行特殊的操作
if(text[i] == pattern[j+1]){
j++;
}
}
//得到最后的j
if(j>=0){
for(int i=0;i<=j;i++){
printf("%c",pattern[i]);
}
printf(" %d\n",j+1);
}else{
printf("%d\n",0);
}
}
return 0;
}
码后反思
- 需要特别注意下面代码的书写:
一定要考虑这种情况,而且这个得写在最前面,不能写成求解次数那也写在后面!因为要考虑if(j == m-1){ //如果完全匹配,那么需要进行回退 j=nex[j]; }
abc
与abc
这种情况。