关于KMP算法next[]数组的两种求法

山路水桥 2012-08-21 08:52:08
第一种求法:
void get_next(int len, char str[]) //len为模式串的长度, str[]为模式串
{
int i;
int j = 0;
for(next[1] = 0, i = 2; i <= len; i++)
{
while(j && str[j + 1] != str[i])
j = next[j];
if(str[j + 1] == str[i])
j++;
next[i] = j;
}
}

第二种求法:
void get_next(int len, char str[]) //len为模式串的长度, str[]为模式串
{
int i = 1;
int j = 0;
while(i < len)
{
if(j && str[i] == str[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
上面两组next[]数组都能进行字符匹配,但生成的next[]数组不一样, 求解~~~
...全文
2382 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Corner 2012-08-21
  • 打赏
  • 举报
回复
#define LEN 20
char buff[LEN] = "abcabcabc";
int next[LEN] = {0};
int len = strlen(buff);
我用这个测试了下第二个失败了。书上KMP也是两种,一个优化的,一个没优化的

void MakeNext(char *buff, int len, int *next)
{
int i = 0, k = -1;
next[0] = -1;
while(i < len - 1)
{
while(k >= 0 && buff[i] != buff[k])
k = next[k];
i++;
k++;
#define IMPROVED
#ifdef IMPROVED
if(buff[i] == buff[k])
next[i] = next[k];
else
next[i] = k;
#else
next[i] = k;
#endif
}
}
healer_kx 2012-08-21
  • 打赏
  • 举报
回复
其实不算是两种求法,不过是一些变形而已。
山路水桥 2012-08-21
  • 打赏
  • 举报
回复
可以执行~~~
Corner 2012-08-21
  • 打赏
  • 举报
回复
一种是优化的,一种是未优化的,未优化的仍然有回溯,你的第二种应该是优化过的KMP算法,不过你确定第二种可以执行么?

65,206

社区成员

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

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