请各位帮忙看一下,KMP模式匹配这一块,输出的位置下标为什么一直是0。
//计算next修正数组值
void get_nextval(SqString t,int nextval[])
{
int i = 1; //待计算的串位置
int j = 0; //被比较的串位置
nextval[1] = 0;
while (i < t.length)
{
if (j == 0 || t.data[i] == t.data[j]) //匹配成功或被比较的串位置值为0
{
++i;
++j;
if (t.data[i] != t.data[j])
{
nextval[i] = j;
}
else
nextval[i] = nextval[j];
}
else //匹配失败 i不变,j继续指向下一个nextval值
{
j = nextval[j];
}
}
}
//KMP算法
//返回模式T在主串s中第pos个字符开始第一次出现的位置。若不存在, 则返回值为0
int Index_KMP(SqString s, SqString t,int pos)
{
int i = pos; //主串起始位置
int j = 1; //模式串起始位置
while (i<=s.length && j<=t.length)
{
if (j == 0 || s.data[i] == t.data[j]) //若相等或子串位j等于0 主串子串都往后移一位然后继续 ,(在BF算法中没有j等于0的情况)
{
++i;
++j;
}
else //不相等 子串j按照next数组移动,主串i不回溯
{
j = nextval[j];
}
}
if (j >= t.length) return i-t.length; //匹配成功
else return 0; //匹配失败
}

这里本意是写一个简单的文本替换,想看一下KMP模式匹配写对了没有,就尝试输出匹配的位置下标,结果都一直是0,看了一些其他人的KMP,写法都一样,实在是不知道错哪了?
如果需要完整代码修改,我可以提供。

最后匹配成功,将匹配成功后的剩余主串返回,并且输出。其匹配成功的下标应该为i-j ;
下面的规律根据上面前后缀的最长相等长度很容易得到
主串与模式串进行匹配,主要不同于BF的方面为,主串指针不回说,当匹配不当时,只移动模式串指针。
当模式串与主串不匹配时,模式串指针根据next数组,进行回溯,