描述:
设 s、t 为两个字符串,分别放在两个一维数组中,m、n 分别为其长度,判断 t
是否为 s 的子串。如果是,输出子串所在位置(第一个字符),否则输出 0。
输入:
输入两个字符串 s1,s2,其中 s1 为主串,s2 为子串。
输出:
如果匹配成功,输出子串所在位置(第一个字符),否则输出 0
输入样例1
ababa ab
输出样例1
1
输入样例2
ababa c
输出样例2
0
Code:(KMP算法nextval数组)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct
{
int length;
char *string;
}String;
void get_nextval(String T,int *nextval)
{
int j=-1;
int i=0;
nextval[0]=-1;
while(i<T.length)
{
if(j==-1||T.string[i]==T.string[j])
{
i++;
j++;
if(T.string[i]!=T.string[j])
{
nextval[i]=j;
}
else
{
nextval[i]=nextval[j];
}
}
else
{
j=nextval[j];
}
}
}
int Index_KMP(String S,String T)
{
int i=-1;
int j=-1;
int nextval[255];
get_nextval(T,nextval);
while(i<S.length&&j<T.length)
{
if(j==-1||S.string[i]==T.string[j])
{
i++;
j++;
}
else
{
j=nextval[j];
}
}
if(j>T.length-1)
{
return i+1-T.length;
}
else
{
return 0;
}
}
int main(void)
{
String S,T;
S.string=(char *) malloc(255*sizeof (char ));
T.string=(char *) malloc(255*sizeof (char ));
scanf("%s",S.string);
scanf("%s",T.string);
S.length=strlen(S.string);
T.length=strlen(T.string);
printf("%d",Index_KMP(S,T));
return 0;
}