您的位置:首页 > 理论基础 > 数据结构算法

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

2016-08-23 13:58 190 查看


这道题的关键在于回溯 j 值的时候,如何避免不必要的回溯,kmp算法就是求得一个next数组, 这个数组就是用来计算 j 的回溯值。

代码如下:

#include <stdio.h>

#include <string.h>

int next[1000001];

char s1[1000001],s2[1000001];

void get_next(int len){

    int i,j;

    i=0;

    j=-1;

    next[0]=-1;

    while(i<len){

        if(j==-1||s2[i]==s2[j]){/*s2[i]表示前缀字符,s2[j]表示后缀字符*/

            ++i;

            ++j;

            if(s2[i]!=s2[j])//若当前字符与前缀字符不同,

                next[i]=j;//则当前的j为next在i位置的值;

            else

                next[i]=next[j];//如果与当前字符相同,则将前缀字符的next值赋给next在i位置的值;

            //next[i]=j;

        }

        else

            j=next[j];//若字符不相同,则j值回溯;

    }

}

int main(){

    int n,m,i,j;

    while(scanf("%s %s",s1,s2)!=EOF){

        n=strlen(s1);

        m=strlen(s2);

        get_next(m-1);//求next数组;

        i=0;

        j=0;

        while(i<n&&j<m){

            if(j==-1||s1[i]==s2[j]){

                i++;

                j++;

            }

            else{

                j=next[j];//j退回到合适的位置,i值不变;

            }

        }

        if(j>=m)

            printf("%d\n",i-j+1);

        else

            printf("-1\n");

    }

    return 0;

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