为了账号安全,请及时绑定邮箱和手机立即绑定

我这样写的KMP算法哪里错了呢?

我这样写的KMP算法哪里错了呢?

C
qq_thinginginli_0 2016-11-13 21:44:43
#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 的变化 编制下一个 与 目标串 匹配的位置) )

第一次没有看出来, 尴尬... 


幸亏又看了一遍

查看完整回答
2 反对 回复 2016-11-22
?
Yexiaomo

TA贡献152条经验 获得超157个赞

用 KMP算法 求 next数组  没有写错
错在了 匹配时, 
31行 的 while()循环体 写错误了(错误原因不知道为啥), 代码改为下面这个
if(j == 0 || goal[i] == list[j]){ 
    ++i;
    ++j;
}else{			
    j = next[j];	
}


查看完整回答
1 反对 回复 2016-11-22
  • 2 回答
  • 1 关注
  • 1257 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信