kmp算法

来源:互联网 发布:温州两家人 知乎 编辑:程序博客网 时间:2024/06/03 12:05
#include<iostream>#include<stdio.h>#include<string.h>#define maxSize 100using namespace std;char *str = new char[10000];char *s = new char[maxSize];int *next = new int[maxSize];void getNext(){    int len = strlen(s);    next[0] = -1;    // i 定位于0,由于无法向前匹配也无法向前求取next[next[i]],所以属于结束条件    int i=0,k = -1;    while(i < len)    {        // 注意放置顺序,由于短路效应,应该先判断k的值如果为-1直接跳出        while( k!=-1 && s[i] != s[k])        {            // 求(MAX)子串,可能子串里面包含更小子串            // 向前缩短直到缩短到0,终止条件为与第一个不相等,向前调到-1            k = next[k];        }        // 满足结束条件直接赋值 0        // 由next[i-1] = k-1成立,符合条件s[i]==s[k],则可以得到next[i] = k;        // k = -1与s[i]==s[k]为对立事件        if(k==-1||s[i]==s[k])        {            ++i,++k;            next[i] = k;        }    }    return ;}int main(){    while(scanf("%s",str)!=-1)    {        //printf("%s\n",s);          scanf("%s",s);          getNext();          printf("\n");          int sLen = strlen(s);          int strLen = strlen(str);       // 下标定位两串开头       int i = 0,k=0;       while(i < strLen)       {           while(k!=-1&&str[i]!=s[k])           {                k = next[k];           }           // 注意i右移时k的复位           if(k==-1 || str[i]==s[k]) // 这个条件可以省略               ++i,++k;            if(k==sLen)                break;       }       if(k==sLen)        printf("成功!\n");    }    return 0;}

原创粉丝点击