数据结构实验之串一:KMP简单应用

来源:互联网 发布:淘宝流量突然爆升爆降 编辑:程序博客网 时间:2024/05/16 18:44
给定两个字符串string1和string2,判断string2是否为string1的子串。

输入

 输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。

输出

 对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。

示例输入

abca12345645abcddd

示例输出

14-1提示要注意数字位置为下标加一源代码在C++环境下测试可正常运行仅供参考
#include<stdio.h>#include<stdlib.h>#include<string.h>char str1[1000001],str2[1000001];int next[1000001];void  get_next(char str[],int next[]){    int k,j,n;    n=strlen(str);    j=0;k=-1;    next[0]=-1;    while(j<n-1)    {        if(k==-1||str[j]==str[k])        {            j++;            k++;            next[j]=k;        }        else k=next[k];    }}int KMP(char str1[],char str2[]){    int i,j,m,n;    i=-1;j=0;    m=strlen(str1);    n=strlen(str2);    while(i<m&&j<n)    {        if(j==-1||str1[i]==str2[j])        {            i++;            j++;        }        else j=next[j];    }    if(j>n-1)        return i-n;    else        return -1;}int main(){    while(~scanf("%s",str1))    {        int x;        scanf("%s",str2);        get_next(str2,next);        x=KMP(str1,str2);        if(x!=-1)            printf("%d\n",x+1);        else            printf("%d\n",x);    }    return 0;}


0 0
原创粉丝点击