为什么c++字符串的length函数会导致错误?

新手上路,请多包涵

问题描述

今天复习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
阅读 3k
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题