在CSDN上看了一个博主的KMP算法,想着做到力扣上的KMP练习一下,不练不知道,一练吓一跳,有些博主麻烦上传的时候自己调试运行一遍,代码中while(j+1<needle.size()+1)那里,原代码是j<needle.size(),j在这里是有可能等于-1的,在size比较的过程中,会自动把j转换成无符号整形变量,导致负数的符号位变了意思,数值也变成了很大的正数,解决办法1,方程两边同时+1。
解决办法2:如果j是一个不知道多大的数,可以用变量记录一下size(),再与j进行比较即可。
问题2:原代码中,getnext函数形参中是int arr,导致报错。因为arr是个数组,在函数形参中以指针的形式进行地址传递,解决办法1:int* arr
解决办法2:int arr[]
KMP应用还是挺广泛的,建议大家学习了解一下
代码如下:
class Solution {
public:
void getnext(int* next,const string& needle){
int k;
int j;
j=0;k=-1;
next[0]=-1;
while(j<needle.size()-1){
if(k==-1||needle[j]==needle[k]){
j++;
k++;
next[j]=k;
}
else{
k = next[k];
}
}
}
int strStr(string haystack, string needle) {
if(needle.size()==0) return 0;
int i =0;
int j = 0;
int next[needle.size()];
getnext(next,needle);
while(i<haystack.size()&&j+1<needle.size()+1){
if(j==-1 || haystack[i]==needle[j]){
i++;
j++;
}
else{
j=next[j];
}
}
if(j>=needle.size()) return (i-needle.size());
else return (-1);
}
};
写在最后:当然还有偷懒的办法
int res = haystack.find(needle);
return res;
完事