KMP算法

参考软件园的一篇讲解,比较简单易懂http://www.cnblogs.com/c-cloud/p/3224788.html

自己理解并敲了代码:以下代码为求出text中pattern匹配的所有的

#include"iostream"
using namespace std;
#define N 100
void getNext(char *pattern, int next[])
{
int m = strlen(pattern);
int k;
next[0] = 0;
for (int i = 1, k = 0; i < m; i++)
{
while (k>0 && pattern[k] != pattern[i])
//原因在于P[k]已经和P[i]失配了,而且P[i-k] ··· P[i-1]又与P[0] ···P[k-1]相同,
//看来P[0]···P[k-1]这么长的子串是用不了了,
//那么我要找个同样也是P[0]打头、P[k-1]结尾的子串即P[0]···P[j-1](j==next[k-1]),
//看看它的下一项P[j]是否能和P[i]匹配。
k = next[k - 1];
if (pattern[k] == pattern[i])
k++;
next[i] = k;
}
}
int* KMP(char *pattern, char *text, int next[])
{
int n = strlen(text);
int m = strlen(pattern);
int all[N] = { 0 };
int count = 0;
getNext(pattern, next);
int k;
cout << "next:";
for (int i = 0; i < m; i++)
cout << next[i] << " ";
cout << endl;
for (int i = 0, k = 0; i < n; i++)
{
while (k>0 && pattern[k] != text[i])
{
k = next[k - 1];
}
if (pattern[k] == text[i])
k++;
if (k == m)
{
cout << "pattern begins:" << (i - m + 1) << endl;

//如果只求出第一个,此时直接return
//return (i - m + 1);

all[count++] = i - m + 1;
}
}
for (int i = 0; i < count; i++)
cout << all[i] << " ";
return all;
}
int main()
{
char *text=new char[100];
char *pattern=new char[100];
int next[N] = { 0 };
//gets(text);
cin >> text;
//gets(pattern);
cin >> pattern;
cout<<KMP(pattern, text, next);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值