@[TOC] 记录一下力扣28题用严蔚敏教材中的kmp求解出现的问题
ERROR42
不用怀疑数组越界了
贴上源码我们来分析一下
class Solution {
public:
void getNext(vector<int> &next,string needle){
int i=0,j=-1;
next[0]=-1;
while(i<needle.size()){
if(j==-1||needle[i]==needle[j]){
i++;//加了之后,可能会导致最后一次越界
j++;
next[i]=j;
}
else{
j=next[j];
}
}
}
int strStr(string haystack, string needle) {
int m=needle.length(),n=haystack.length();
if(m>n)
return -1;
vector<int> next(m,0);
getNext(next,needle);
int i=-1,j=-1;
while(i<n&&j<=m-1){
if(j==-1||needle[j]==haystack[i]){
i++;
j++;
}
else{
j=next[j];
}
}
if(j==m)
return i-m;
return -1;
}
};
出问题的地方在这里
可能在手推的时候最后一轮发现没有问题就停止了。
事实上最后一轮,之后还有一轮,会立刻导致越界
测试needle为issip
长度为5,下标从0开始
当我们函数执行到给next[4]赋值时
此时的i是符合 while的循环条件的
因为i=4 <5
这时候会进入while导致出现一次i++
此时 i=5
紧接着会执行next[5]=j
发生越界!
记录一下问题,与诸君共勉。