kmp算法 poj2752 Seek the Name, Seek the Fame

来源:互联网 发布:tvp动画软件 编辑:程序博客网 时间:2024/05/23 02:15

kmp算法是一种字符匹配算法是指给定一个字符串A和一个字符串B,问A中是否包含B。

   他分两个部分:(算法不难,发代码自行体会吧)

                一:先说主程序吧

                代码:

//主程序j = 0;for(i = 1; i <= n; i++) {    while(j > 0 && B[j+1] != A[i]) j = next[j];    if (B[j+1] == A[i]) j++;    if (j == m) {        printf("matching complete! jump to next[j]");        j = next[j]; //把后面的也找出来,如果找一个可以break了;    }}
                 二:预处理next数组:

                代码:

//预处理next;next[1] = 0;j = 0;for(i = 2; i <= m; i++) {    while(j > 0 && B[j+1] != B[i]) j = next[j];    if (B[j+1] == B[i]) j++;    next[i] = j;}
     有没有发现这两段代码非常相似。

 下面看poj的这个题目吧;这里主要与next数组的预处理非常相似/

     下面直接发代码:

#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>const int maxn = 400008;using namespace std;char c[maxn];int next[maxn];int main() {    int result[maxn];    while(~scanf("%s", c)) {        memset(next, -1, sizeof(next));        next[0] = -1;        int l = -1;        int lc = strlen(c);        for(int i = 1; i < lc; i++) { //这里注意不能写i < strlen(c);会超时,因为调用了很多次strlen函数;            while(l >= 0 && c[l+1] != c[i]) l = next[l];            if (c[l+1] == c[i]) l++;            next[i] = l;        }        int i = lc - 1;        int j = 0;        while(i != -1) {            result[j++] = i + 1;            i = next[i];        }        for(int k = j-1; k >= 0; k--)            printf("%d ", result[k]);        printf("\n");    }return 0;}

0 0
原创粉丝点击