while ((i < T.length()) && (j < P.length())) {//bug,未知原因 i=某值 j=-1时会跳出while循环
if (j == -1 || T[i] == P[j]) {
i++; j++;
}
else j = next_array[j];
}
以上是kmp主体循环
bug:j=-1时跳出循环
这是由于length函数返回的是个unsigned,假如在判断过程中,j变成了-1,j < P.length()这个条件将不会再成立,因此循环退出。
改进方法1:
提前定义长度
int n = T.length();
int m = P.length();
while (i < n && j < m)
改进方法2:
强制类型转换
while(i<(signed int)test.length()&&j< (signed int)par.length())
结尾:
很多参考资料都是按照有bug的写法。
学习算法还是要真正上机编写代码,否则很难发现错误。