kmp算法模板

学习

题目:Nikhil's Password

求next数组的算法:

代码1:
该代码存在重复计算,样例:aaaaaaad,aaad。 

View Code
void get_next(const string sub, int *next)
{
int len=sub.length();
int i,k;
next[
0]=k=-1;
for (i=0; i<len;)
{
if (k==-1 || sub[i]==sub[k])
{
next[
++i]=++k;
}
else k=next[k];
}
}

代码2:
优化了代码1中重复计算的问题。

View Code
void get_next(const string sub, int *next)
{
int len=sub.length();
int i,k;
next[
0]=k=-1;
for (i=0; i<len;)
{
if (k==-1 || sub[i]==sub[k])
{
k
++; i++;
if (sub[k]!=sub[i]) next[i]=k;
else next[i]=next[k]; //避免重复计算优化next数组
}
else k=next[k];
}
}

  KMP算法:

 

View Code
int KMP(const string str, const string sub, const int *next) //返回子串在主串中的起始位置下标
{
int i,j;
int len1=str.length();
int len2=sub.length();
for (i=0, j=0; i<len1 && j<len2;)
{
if (j==-1 || str[i]==sub[j])
{
i
++; j++;
}
else
{
j
=next[j];
}
}
if (j==len2) return i-len2;
return -1; //如果找不到就返回-1
}

posted on 2011-04-07 13:25  tzc_yujunyong  阅读(439)  评论(0)    收藏  举报