您的位置:首页 > 编程语言

KMP及next数组实现代码

2018-01-31 16:59 337 查看

next数组求解:

以1开始,next[1]=0,next[2]=1,next
:将前面n-1个字符,计算从首尾开始组成最大的相同子串的长度,如果找到,那么next值是该长度加1,否则next值是1。

void getNext(char *p,int *next)
{
int j,k;
next[1]=0;
j=1;
k=0;
while(j<strlen(p)-1)
{
if(k==0||p[j]==p[k])    //匹配的情况下,p[j]==p[k],next[j+1]=k+1;
{
j++;
k++;
next[j]=k;
}
else                   //p[j]!=p[k],k=next[k]
k=next[k];
}
}


KMP实现:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int KMP(string S, string T)
{
vector<int> next = getNext(T);
int i = 1, j = 1;
while (S[i] != '\0' && T[j] != '\0')
{
if ( j==0 || S[i] == T[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
if (T[j] == '\0')
return i - j + 1;
else
return 0;
}

int main()
{
string S = "ababaababcb";
string T = "ababc";
int num = KMP(S, T);
cout << num;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: