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

来源:互联网 发布:2017大数据标准化论坛 编辑:程序博客网 时间:2024/06/07 23:43


这道题的关键在于回溯 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;
}

0 0
原创粉丝点击