猿问

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

#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;
}

qq_thinginginli_0
浏览 1258回答 2
2回答

Yexiaomo

晓得了,还是 31 行 的 while() 循环体写错了把  if( list[i] == goal[j] ) --->改为  if( list[j] == goal[i] )  然后就可以了,....-----这个错误很明显吧,  个人理解-->(下标 j 对应  模式串(--> 同时 对应于 next 数组, j 的变化 编制下一个 与 目标串 匹配的位置) )第一次没有看出来, 尴尬... 幸亏又看了一遍

Yexiaomo

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