kmp

来源:互联网 发布:老人海边摸蛤 知乎 编辑:程序博客网 时间:2024/06/18 07:10
class Solution {public: int kmpSearch(char *s,char *p,int next[]){    int i=0;    int j=0;    int sLen=strlen(s);    int pLen=strlen(p);    while(i<sLen&&j<pLen)    {        if(j==-1||s[i]==p[j])        {            i++;            j++;        }        else        {            j=next[j];        }    }    if(j==pLen)        return i-j;    else        return -1;}void getNext(char *p,int next[]){    int pLen=strlen(p);    next[0]=-1;    int k=-1;    int j=0;    while(j<pLen)    {        if(k==-1||p[j]==p[k])        {            k++;  // p0p1...pk-1 pk     pj-k...pj-1  pj  已知next[j]=k;求 next[j+1]=? 看pk是否和pj相等,若相等。next[j+1]=k+1;            j++;            next[j]=k;//否则 就往前走了,可能是是更小的一段。        }        else            k=next[k];    }}    int strStr(char *a, char *b) {        int lenA=strlen(a);        int lenB=strlen(b);        if(lenB>lenA) return -1;            int *next=new int[strlen(a)];     getNext(b,next);     return kmpSearch(a,b,next);            }};
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>using namespace std;char mo[10005];char str[1000005];int N;int main() {scanf("%d", &N);while(N--) {scanf("%s %s", mo, str);int next[10005] = {-1};int i = 0, j = -1, len = strlen(mo);while(i < len) {//获得next函数 if(j == -1 || mo[i] == mo[j]) next[++i] = ++j;else j = next[j];}int ans = 0, len1 = strlen(str);i = j = 0;while(i < len1) {//求模式串在原串中出现的次数 if(j == -1 || str[i] == mo[j]) ++i, ++j;else j = next[j];if(j == len) ans++;}printf("%d\n", ans);}return 0;}


0 0
原创粉丝点击