字符数组下标从0开始,这个要注意一下,每次判断的时候当前i,j减一进行判断
题目描述
KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置。严蔚敏老师的书中详细描述了KMP算法,同时前面的例子中也描述了子串移动位置的数组实现的算法。前面你已经实现了子串移动的数组,现在就来利用该数组来实现KMP模式匹配。
下面是相应的算法:
图:KMP算法
输入格式
3组字符串,每组字符串占一行。每行包含由空格分隔的两个字符串,字符串仅由英文小写字母组成且长度不大于100。
输出格式
每组数据输出1行,输出后一个字符串在前一个字符串中的位置,如果不匹配,则输出0。
样例输入
string str thisisalongstring isa nosubstring subt
样例输出
1 5 0
#include<stdio.h>
#include<string.h>
void next_(int next[],char s[]);//获取next数组
int main(){
char s1[128];
char s2[128];
int l1;
int l2;
while(~scanf("%s",s1)){
getchar();
scanf("%s",s2);
getchar();
int next[128];
l1=strlen(s1);
l2=strlen(s2);
next_(next,s2);
int i=1,j=1;
while(i<=l1&&j<=l2){
if(j==0||s1[i-1]==s2[j-1]){//注意减一
i++;
j++;
}
else{
j=next[j];
}
}
if(j>l2)
printf("%d\n",i-l2);
else
printf("0\n");
}
}
void next_(int next[],char s[]){
int l=strlen(s);
next[1]=0;
int i=1;
int j=0;
while(i<l){
if(j==0||s[i-1]==s[j-1]){//注意减一
i++;
j++;
if(s[i-1]!=s[j-1])
next[i]=j;
else
next[i]=next[j];
}
else{
j=next[j];
}
}
}