主题:[讨论]KMP算法中模式串next函数值总是出错
zhangsan5421
[专家分:140] 发布于 2007-01-02 14:47:00
#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);
}
/*上面是我的代码,不知道错在哪里了,老是不正确,请大家帮我看看,谢谢啦*/
最后更新于:2007-01-04 12:29:00
回复列表 (共7个回复)
沙发
boxertony [专家分:23030] 发布于 2007-01-04 10:05:00
#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);
}
板凳
zhangsan5421 [专家分:140] 发布于 2007-01-04 12:29:00
[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 楼
boxertony [专家分:23030] 发布于 2007-01-04 13:54:00
[quote]我把next[0]=-1这条语句去掉。后面的下表count=0从零开始,还是不能出现正确答案。
[/quote]
不能去掉,直接把j==0改为j==-1就可以得到正确结果了。
4 楼
zhangsan5421 [专家分:140] 发布于 2007-01-04 23:23:00
[quote][quote]我把next[0]=-1这条语句去掉。后面的下表count=0从零开始,还是不能出现正确答案。
[/quote]
不能去掉,直接把j==0改为j==-1就可以得到正确结果了。[/quote]
我去掉,还是试了你的提议,输入"aaaab"后的结果是01230,这个结果是错误的,正确的是01234的。
5 楼
boxertony [专家分:23030] 发布于 2007-01-05 08:45:00
[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 楼
zhangsan5421 [专家分:140] 发布于 2007-01-05 10:35:00
[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 楼
boxertony [专家分:23030] 发布于 2007-01-05 12:37:00
[quote]但是上面的next函数的结果是错误的,正确的是01234,不知道怎么改正。我已经改了很多次,按照数据结构书上面的思路写的代码。
[/quote]
你的next[0]设置为-1,结果当然是-1 0 1 2 3,结果完全正确,如果从0开始就是0 1 2 3 4了。你看看把-1 0 1 2 3 每个加1不就是了吗。
我来回复