#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
//next[j] 表示s[i]<>p[j],下一个需要比较的字符从next[j]开始
//生成next[]的过程相当于自身匹配前缀串和后缀串, i指向后缀串,j指向前缀串
void getNextVal(char p[], int len, int next[])
{
int i, j;
i = 0;
j = -1;
next[0] = -1;
while(p[i] != '\0')
{
if (j == -1 || p[i] == p[j])
{
i++;
j++;
//若前一个字串相同,但当前字符不等,next[i] = j-1+1 = j
if (p[i] != p[j])
{
next[i] = j;
}
else
{
next[i] = next[j];
}
}
else
{
j = next[j];
}
}
}
int KMP(char s[], int slen, char p[], int plen)
{
int i = 0;
int j = 0;
int * next = new int[plen + 1];
getNextVal(p, plen, next);
cout<<"next:\n";
for (int k = 0; k < plen; k++)
{
cout<<next[k]<<" ";
}
cout<<"\n";
while (i < slen && j < plen)
{
if (j == -1 || s[i] == p[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j >= plen)
{
return i - plen;
}
else return -1;
}
int main(void)
{
char s[] = "abababc";
char p[] = "ababc";
int n = KMP(s, strlen(s), p, strlen(p));
if (n >= 0)
cout<<"find out the matched string from:"<<&(s[n])<<endl;
}
KMP 算法--- 搜索匹配字符串
最新推荐文章于 2014-01-08 22:45:58 发布