题目描述
KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置。书中详细描述了KMP算法,前面你已经计算了子串移动的next数组,现在就来利用该next数组来实现KMP模式匹配。
输入
3组字符串,每组字符串占一行。每行包含由空格分隔的两个字符串,字符串仅由英文小写字母组成且长度不大于100。
输出
每组数据输出1行,输出后一个字符串在前一个字符串中的位置,如果不匹配,则输出0。
样例输入 Copy
string str
thisisalongstring isa
nosubstring subt
样例输出 Copy
1
5
0
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char a[105];
char b[105];
char next[105];
int L1, L2;
void f()
{
int i;
next[0]=-1;
int j=-1;
for(i=1;i<strlen(a);i++)
{
while(j!=-1&&a[i]!=a[j+1]) j=next[j];
if(a[i]==a[j+1]) j++;
if(j==-1||a[i+1]!=a[j+1]) next[i]=j;
else next[i] = next[j];
}
}
int KMP()
{
int i;
int j = -1;
f();
for(i=0;i<L2;i++)
{
while(j!=-1&&b[i]!=a[j+1]) j=next[j];
if(b[i] == a[j+1]) j++;
if(j == L1-1) return i+1-L1;
}
return -1;
}
int main()
{
int i, j, x, k = 3;
while(k--)
{
scanf("%s %s", b, a);
L1=strlen(a);
L2=strlen(b);
x=KMP();
printf("%d\n", x+1);
}
return 0;
}