kmp算法,不知错在哪

z729063706 2017-04-11 01:27:38
洛谷P3375

输入两个字符串
输出出现的位置及next【i】数组

#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
char s1[1000000];
char s2[1000];
int len1,len2;
int next[1000];
void kmp_next()
{
int i=0;
int j=-1;
next[0]=-1;
while (i<len2)
{
if(j==-1||s2[i]==s2[j])
{
i++;
j++;
next[i]= j;
}
else
{
j=next[j];
}
}
}
int main()
{
scanf("%s",&s1);
scanf("%s",&s2);
len1=strlen(s1);
len2=strlen(s2);
kmp_next();
int i=0;
int j=0;
while((i<len1)&&(j<len2))
{
if((j==-1)||(s1[i]==s2[j]))
{
i++;
j++;
}
else j=next[j];
if(j>=len2) printf("%d\n",i-len2);
}
for (int m=0;m<len2;m++)
printf("%d ",next[m]);
return 0;
}


谢谢好心大佬,
...全文
480 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-04-11
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。 “多一少一”问题占程序员常犯错误的10%以上! 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个? <、<=、==、>、>=中的哪个?

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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