KMP算法找next值代码,添加注释

sicofield 2013-09-13 04:44:17
对于KMP算法,找next值是怎么递推的我搞不明白,对于一些判定条件和返回条件不清楚,我这里有两个找next值的算法,第一个是经过优化的,第二个是没有优化的。求大神补充下注释!!越详细越好啊。已经知道kmp中next值的含义。。
void get_nextval(char const* ptrn, int plen, int* nextval)    
{
int i = 0;
nextval[0] = -1;
int j = -1;
//初始化
while( i < plen-1 )
{
if( j == -1 || ptrn[i] == ptrn[j] )
{
++i;
++j;
if( ptrn[i] != ptrn[j] )
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];
}
}
void getNext(char *p,int *next)
{
int j,k;
next[0]=-1; j=0; k=-1;
while(j<strlen(p)-1)
{
if(k==-1||p[j]==p[k])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
...全文
144 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
baihacker 2014-02-28
  • 打赏
  • 举报
回复
template<typename ElemType>
int MatchKMP(ElemType* t, int n, ElemType* p, int m, vector<int>& result)
{
	int	* Prefix = new int[m];
	{
// Prefix[i]表示串p[0], p[1], ... p[Prefix[i]]和 p[i-Prefix[i]], p[i-2], p[i-1], p[i]
// 相同,且Prefix[i]最大
// 也就是最长的前缀,使得和后缀相同
		Prefix[0] = -1; // 初始值为-1,
		for (int i = 1, F = -1; i < m; ++i)
		{// 计算Prefix[i]
                 // F表示Prefix[i-1]的值
                    // 要计算Prefix[i]则可以根据F算出来,如果F位置后面的那个
                    // 和p[i]相同,那么F+1就是所求,否则让F向前推一层
			while (F >= 0 && p[F+1] != p[i]) F = Prefix[F];
			if (p[F+1] == p[i]) ++F;
			Prefix[i] = F;
		}
	}
	{
		result.clear();
		for (int i = 0, F = -1; i < n; ++i)
		{
			while (F >= 0 && p[F+1] != t[i]) F = Prefix[F];
			if (p[F+1] == t[i]) ++F;
			if (F+1 == m)
			{
				result.push_back(i-m+1);
				F = Prefix[F];
			}
		}
	}
	delete[] Prefix;
	return result.size();
}
sicofield 2014-02-28
  • 打赏
  • 举报
回复
没有人回答啊,随便回答个什么我把分结了!!!

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧