您的位置:首页 > 其它

KMP字符串匹配,字串

2014-08-28 16:47 246 查看
题意:输入多组,判断str2是否是str1的字串,是则输出串1在串2中的位置,否则输出-1;

//当主串中第i个字符与模式中第j个字符“失配”时,  

//主串中第i个字符应该与模式中哪个字符再比较。  

#include <stdio.h>  

#include <stdlib.h>  

#include <string.h>  

char str1[1000000],str2[1000000];  

int next[1000000];  

void getnext(int t)//next[j]表示当模式中第j个字符与主串中相应字符“失配”时,在模式中需要重新和主串中该字符进行比较的字符的位置。  

{  

    int i,j;  

    i=1;j=0;next[i]=0;  

    while(i<=t)  

    {  

        if(j==0||str2[i-1]==str2[j-1])  

        {  

            i++;j++;  

            next[i]=j;  

        }  

        else  

            j=next[j];  

    }  

}  

int KMP(int s,int t)  

{  

    int i,j;  

    i=1;j=1;  

    while(i<=s&&j<=t)  

    {  

        if(j==0||str1[i-1]==str2[j-1])  

        {  

            i++;j++;  

        }  

        else  

            j=next[j];  

    }  

    if(j>t)  

        return (i-t);  

    else  

        return -1;  

}  

int main()  

{  

    int s,t,g;  

   while(~scanf("%s%s",str1,str2))  

   {  

    s=strlen(str1);  

    t=strlen(str2);  

    getnext(t);  

    g=KMP(s,t);  

    printf("%d\n",g);  

   }  

    return 0;  

}   

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: