请各位帮忙看一下,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,写法都一样,实在是不知道错哪了?
如果需要完整代码修改,我可以提供。