时间:2016-12-07 01:14:21

标签: c++ string

我用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>

0 个答案:

没有答案