问题描述
今天复习kmp算法,用c++实现,结果一来就遇到了坑。所以想请问一下各位是什么原因导致的错误。
代码
代码1
#include <bits/stdc++.h>
using namespace std;
void getNext(vector<int>& next,const string& p){
next[0]=-1;
int i=0,j=-1;
while(i<p.length()){
if(j==-1||p[i]==p[j]){
i++;
j++;
next[i]=(p[i]!=p[j]?j:next[j]);
}else{
j=next[j];
}
}
}
int kmp(const vector<int>& next,const string& t,const string& p){
int i=0,j=0;
int tlen=t.length(),plen=p.length();
int circles=0;
while(i<t.length()&&j<p.length()){//与代码2唯一的不同之处
circles++;
if(j==-1||t[i]==p[j]){
i++;
j++;
}else{
j=next[j];
}
}
cout<<"circles:"<<circles<<endl;
if(j==p.length()){
return i-j;
}
return -1;
}
int main()
{
string t,p;
t="fgdsabcab";
p="abcab";
vector<int> next(1000);
getNext(next,p);
cout<<kmp(next,t,p);
return 0;
}
运行结果
circles:1
-1
代码2
#include <bits/stdc++.h>
using namespace std;
void getNext(vector<int>& next,const string& p){
next[0]=-1;
int i=0,j=-1;
while(i<p.length()){
if(j==-1||p[i]==p[j]){
i++;
j++;
next[i]=(p[i]!=p[j]?j:next[j]);
}else{
j=next[j];
}
}
}
int kmp(const vector<int>& next,const string& t,const string& p){
int i=0,j=0;
int tlen=t.length(),plen=p.length();
int circles=0;
while(i<tlen&&j<plen){//与代码1唯一的不同之处
circles++;
if(j==-1||t[i]==p[j]){
i++;
j++;
}else{
j=next[j];
}
}
cout<<"circles:"<<circles<<endl;
if(j==p.length()){
return i-j;
}
return -1;
}
int main()
{
string t,p;
t="fgdsabcab";
p="abcab";
vector<int> next(1000);
getNext(next,p);
cout<<kmp(next,t,p);
return 0;
}
运行结果
circles:13
4
https://blog.csdn.net/a553455...
j是不是可能会取到负值。length函数返回的类型是size_t是无符号类型。