#include <stdio.h>
#include <string.h>
int main()
{
int next[30];
int i=1,j=0;
char list[30] ="abc";
char goal[100]="abdabce";
next[0]=-1;
next[1]=0;
int lenlist=strlen(list);
while(i<lenlist)
{
if(j==0 || list[i]==list[j])
{
i++;
j++;
next[i]=j;
}
else
{
j=next[j];
}
}
for(i=0;i<=lenlist;i++)
{
printf("%d ",next[i]);
}
i=0;
j=0;
while(list[j] && goal[i])
{
if(list[i]==goal[j])
{
i++;
j++;
}
else if(j==-1)
{
i++;
j++;
}
else
{
j=next[j];
}
}
printf("j=%d ",j);
if(j==lenlist)
{
printf("包含");
}
else
{
printf("不包含");
}
return 0;
}
2 回答
已采纳
Yexiaomo
TA贡献152条经验 获得超157个赞
晓得了,
还是 31 行 的 while() 循环体写错了
把 if( list[i] == goal[j] ) --->改为 if( list[j] == goal[i] )
然后就可以了,....
-----
这个错误很明显吧, 个人理解-->(下标 j 对应 模式串(--> 同时 对应于 next 数组, j 的变化 编制下一个 与 目标串 匹配的位置) )
第一次没有看出来, 尴尬...
幸亏又看了一遍
Yexiaomo
TA贡献152条经验 获得超157个赞
用 KMP算法 求 next数组 没有写错 错在了 匹配时, 31行 的 while()循环体 写错误了(错误原因不知道为啥), 代码改为下面这个
if(j == 0 || goal[i] == list[j]){ ++i; ++j; }else{ j = next[j]; }
- 2 回答
- 1 关注
- 1257 浏览
添加回答
举报
0/150
提交
取消