zhuaaaaaazhu 2017-04-12 15:40 采纳率: 33.3%
浏览 953

我感觉非常奇怪不能理解,请大神帮忙看看

C语言一个非常奇怪的问题。大神们来看看。。。
//下面是我写的测试KMP算法的程序。问题在KMP算法注释中。。。。。。。。。
#include
#include
int next[10]={0};
void findnextal(char *s)
{
int i=0,k=-1,len;
len=strlen(s)-1;
next[0]=-1;
while(i<len)
{
while(k==-1||s[i]==s[k])
{
i++;
k++;
next[i]=k;
while(s[i]==s[k])
{
next[i]=next[k];
k=next[i];
}
}
k=next[k];
}
}
int kmp(char *s,char *p)
{
int i=0,j=0;

    while(j!=strlen(p)&&i<strlen(s))//为什么把j!=strlen(p)改为j<strlen(p)程序就失效了? 
    {
        if(s[i]==p[j]||j==-1)
        {
            i++;
            j++;
        }
        else j=next[j];
    }
    if(j==strlen(p)) return i-strlen(p);
    else return -1;

}
int main()
{
int i;
char str[100],s[100];
printf("input p:\n");
gets(str);
findnextal(str);
for(i=0;i<strlen(str);i++)
{
printf("%d ",next[i]);
}

printf("puts s:\n");
gets(s);
printf("%d ",kmp(s,str));
return 0;
}

  • 写回答

1条回答 默认 最新

  • threenewbee 2017-04-12 15:42
    关注

    else j=next[j];
    j并非单一递增,所以!=和<并不等价

    评论

报告相同问题?

悬赏问题

  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真