数据结构实验之串一:KMP简单应用
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
给定两个字符串string1和string2,判断string2是否为string1的子串。
Input
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。
Output
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。
Sample Input
abc
a
123456
45
abc
ddd
Sample Output
1
4
-1
Hint
Source
cjx
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char s1[1000001],s2[1000001];
int nex[1000001];
void next(char s2[],int len2)
{
nex[0]=-1;
int k=-1;
for(int i=1;i<len2;i++)//第二个数组和第二个数组进行比较;从第一个开始比较
{
while(k>-1&&s2[k+1]!=s2[i])//在前面都相等的前提下比较s2[k+1]和s2[i]的关系
//如果不相等就比较前一个最大前后缀后面的那个数和当前的值是不是相等的,相等的看下面的
//if语句,进行加一,不相等的话继续比较前一个最大的前后缀,直到比较到了-1,如果s2[k+1]和s2[i]
//还不相等,当前的s2[i]对应的next就是-1了;
{
k=nex[k];
}
if(s2[k+1]==s2[i])k=k+1;
nex[i]=k;
}
}
int kmp(char s1[],char s2[],int len1,int len2)
{
next(s2,len2);
int k=-1;
for(int i=0;i<len1;i++)
{
while(k>-1&&s2[k+1]!=s1[i])
{
k=nex[k];//当前的如果不相等,就k=next[k],把k对应的位置拉过来进行匹配;
}
if(s2[k+1]==s1[i])k++;//如果相等的话i和k就继续往后走,这个时候k是等于-1的
//如果一直不相等i就往后走,直到s2[k+1]==s1[i]就继续比较;
if(k==len2-1)return i-k+1;//如果k走到了最后就说明完全匹配好了,就返回值
}
return -1;
}
int main()
{
while(~scanf("%s%s",s1,s2))
{
int len1=strlen(s1);
int len2=strlen(s2);
int t=kmp(s1,s2,len1,len2);
if(t!=-1)printf("%d\n",t);
else printf("-1\n");
}
return 0;
}