我用C ++编写了一个KMP子字符串搜索程序。编译是oK,但结果与我的预期不一样。我的代码是
class Solution {
public:
static int kmpSearch(const string& s, const string& p){
int* next = new int[p.length()];
getNext(p, next);
int i=0;
int j=0;
while(i<s.length() && j<p.length()){
if(j==-1 || s.at(i) == p.at(j)){
i++; j++;
}else{
j=next[j];
}
}
delete next;
if(j==p.length()) return i-j;
else return -1;
}
static void getNext(string p, int* next){
int len = p.length();
next[0] =-1;
int j=0;
int k=-1;
while(j<len-1){
if(k==-1 || p[j]==p[k]){
j++;
k++;
next[j]=k;
}else{
k=next[k];
}
}
}
};
int main(int argc, char* argv[]){
string s(argv[1]);
string p(argv[2]);
int loc = Solution::kmpSearch(s, p);
std::cout<<" the location is "<< s << " "<< p<< " " <<loc<< std::endl;
}
我在方法while(i<s.length() && j<p.length())
的条件kmpSearch
中使用GDB进行调试和一些奇怪的事情。这是我的GDB调试输出。
(gdb) l
9
10 int* next = new int[p.length()];
11 getNext(p, next);
12 int i=0;
13 int j=0;
14 while(i<s.length() && j<p.length()){
15 if(j==-1 || s.at(i) == p.at(j)){
16 i++; j++;
17 }else{
18 j=next[j];
(gdb) p j
$24 = -1
(gdb) p p.length()
$25 = 3
(gdb) p j<p.length()
$26 = false
(gdb)
参数为shijie jie
。奇怪的是第14行p j<p.length()
应该是真的,因为j =-1
和p.length 3 ,但它会打印 false < / p>