#include<bits/stdc++.h>
using namespace std;
int *getNext(string p)
{
int l = p.length(), k = -1, i = 0;
int *next = new int[l];
next[0] = -1;
while(i < l - 1)
{
while(k >= 0 && p[k] != p[i])
k = next[k];
i++;
k++;
if(p[i] == p[k])
next[i] = next[k];
else
next[i] = k;
}
return next;
}
int KMPMatching(int *next, string p, string r)
{
//在 p 中寻找 r
int i = 0, j = 0; //i指向p,j指向r
int pl = p.length(), rl = r.length();
if(pl < rl)
return -1;
while(i < pl && j < rl)
{
if(j == -1 || p[i] == r[j])
i++, j++;
else
j = next[j];
}
if(j >= rl) //说明r被扫描完了,即找到匹配的了
return (i - rl);
else
return -1;
}
int main()
{
string p = "abcdaabcab";
string r = "daa";
int *next = getNext(p);
for(int i = 0; i < p.length(); i++)
cout << next[i] << " ";
cout << endl;
cout << KMPMatching(next, p, r);
return 0;
}
字符串匹配 - KMP算法
最新推荐文章于 2018-09-06 16:30:32 发布