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

来源:互联网 发布:团队协作工具知乎 编辑:程序博客网 时间:2024/06/16 01:00

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

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic

Problem Description

给定两个字符串string1和string2,判断string2是否为string1的子串。

Input

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

Output

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

Example Input

abca12345645abcddd

Example Output

14-1

Hint

 

Author

cjx
#include <stdio.h>#include <string.h>char st1[1000000],st2[1000000];int next[1000000];void nex(){    int i=0,j=-1;//j是从-1开始的    next[0]=-1;    int k=strlen(st1);    while(i<k-1)    {        if(j==-1||st1[i]==st1[j])        {            i++;            j++;            next[i] = j;        }        else            j=next[j];    }}int kmp()//参考:http://blog.csdn.net/v_july_v/article/details/7041827{    nex();    int i=0,j=0;    int len1=strlen(st1),len2=strlen(st2);    while(i<len1&&j<len2)    {        if(j==-1||st1[i]==st2[j])//和nex函数判断条件相似        {            i++;            j++;        }        else            j=next[j];//相当于i不变,j移动了j-next[j]个单位    }    if(j==len2)    {        return i-j+1;    }    else        return -1;}int main(){    while(scanf("%s",st1)!=EOF)    {        scanf("%s",st2);        printf("%d\n",kmp());    }    return 0;}


原创粉丝点击