回 帖 发 新 帖 刷新版面

主题:[讨论]KMP算法中模式串next函数值总是出错

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_SIZE 100

int *pat(char *string,int *next)
{

    int len=strlen(string);
    int i=1,j=0;
//  next[0]=-1;根据楼下的提示我已经把这局话去掉了
    next[1]=0;
    while (i<len)
    {
        if (j==0 || string[i]==string[j])
        {
            ++i;
            ++j;
            next[i]=j;
        }
        else
            j=next[j];
    }
    return next;
}


void main()
{
    char string[25];
    int next[25];
    printf("Please input a string:");
    scanf("%s",&string);
    if (strlen(string)>25)
        exit(1);
    printf("%d\n",strlen(string));
    

    pat(string,next);
    for (int count=1;count<=strlen(string);count++)//下表从零开始
        printf("%d ",next[count]);
    exit(0);

}
/*上面是我的代码,不知道错在哪里了,老是不正确,请大家帮我看看,谢谢啦*/

回复列表 (共7个回复)

沙发

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_SIZE 100

int *pat(char *string,int *next)
{

    int len=strlen(string);
    int i=1,j=0;
    next[0]=-1;
    next[1]=0;
    while (i<len)
    {
        if (j==0 || string[i]==string[j]) // 既然你设置next[0]=-1,那么这儿判断就应该是j==-1
        {
            ++i;
            ++j;
            // 下面的语句最好再改一下(当然这样也可以,但改了后的效果更好)
            next[i]=j;
        }
        else
            j=next[j];
    }
    return next;
}


void main()
{
    char string[25];
    int next[25];
    printf("Please input a string:");
    scanf("%s",&string);
    if (strlen(string)>25)
        exit(1);
    printf("%d\n",strlen(string));
    

    pat(string,next);

    // 下标从0开始
    for (int count=1;count<=strlen(string);count++)
        printf("%d ",next[count]);
    exit(0);

}

板凳

[quote]#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_SIZE 100

int *pat(char *string,int *next)
{

    int len=strlen(string);
    int i=1,j=0;
    next[0]=-1;
    next[1]=0;
    while (i<len)
    {
        if (j==0 || string[i]==string[j]) // 既然你设置next[0]=-1,那么这儿判断就应该是j==-1
        {
            ++i;
            ++j;
            // 下面的语句最好再改一下(当然这样也可以,但改了后的效果更好)
            next[i]=j;
        }
        else
            j=next[j];
    }
    return next;
}


void main()
{
    char string[25];
    int next[25];
    printf("Please input a string:");
    scanf("%s",&string);
    if (strlen(string)>25)
        exit(1);
    printf("%d\n",strlen(string));
    

    pat(string,next);

    // 下标从0开始
    for (int count=1;count<=strlen(string);count++)
        printf("%d ",next[count]);
    exit(0);

}
[/quote]
我把next[0]=-1这条语句去掉。后面的下表count=0从零开始,还是不能出现正确答案。

3 楼

[quote]我把next[0]=-1这条语句去掉。后面的下表count=0从零开始,还是不能出现正确答案。
[/quote]
不能去掉,直接把j==0改为j==-1就可以得到正确结果了。

4 楼

[quote][quote]我把next[0]=-1这条语句去掉。后面的下表count=0从零开始,还是不能出现正确答案。
[/quote]
不能去掉,直接把j==0改为j==-1就可以得到正确结果了。[/quote]

我去掉,还是试了你的提议,输入"aaaab"后的结果是01230,这个结果是错误的,正确的是01234的。

5 楼

[quote][quote][quote]我把next[0]=-1这条语句去掉。后面的下表count=0从零开始,还是不能出现正确答案。
[/quote]
不能去掉,直接把j==0改为j==-1就可以得到正确结果了。[/quote]

我去掉,还是试了你的提议,输入"aaaab"后的结果是01230,这个结果是错误的,正确的是01234的。
[/quote]
不去掉next[0]=-1,输出的循环从0开始,结果应该是
-1 0 1 2 3       (因为下标是从0开始的,而且你的j值初始设置的就是0)
而不是0 1 2 3 4

6 楼

[quote][quote][quote][quote]我把next[0]=-1这条语句去掉。后面的下表count=0从零开始,还是不能出现正确答案。
[/quote]
不能去掉,直接把j==0改为j==-1就可以得到正确结果了。[/quote]

我去掉,还是试了你的提议,输入"aaaab"后的结果是01230,这个结果是错误的,正确的是01234的。
[/quote]
不去掉next[0]=-1,输出的循环从0开始,结果应该是
-1 0 1 2 3       (因为下标是从0开始的,而且你的j值初始设置的就是0)
而不是0 1 2 3 4[/quote]
但是上面的next函数的结果是错误的,正确的是01234,不知道怎么改正。我已经改了很多次,按照数据结构书上面的思路写的代码。

7 楼

[quote]但是上面的next函数的结果是错误的,正确的是01234,不知道怎么改正。我已经改了很多次,按照数据结构书上面的思路写的代码。
[/quote]
你的next[0]设置为-1,结果当然是-1 0 1 2 3,结果完全正确,如果从0开始就是0 1 2 3 4了。你看看把-1 0 1 2 3 每个加1不就是了吗。

我来回复

您尚未登录,请登录后再回复。点此登录或注册