C++版本KMP算法(包含next数组)

提前声明:
kmp相关视频解析查看点这个->KMP算法-超细超全讲解
如果对你有帮助,可以在这个大佬视频一键三连!

我参考大佬的思路写下来的c++版本
测试中遇到的bug:
a.length() 需要转化为int型,不然不能实现

求next数组类似看门牌算法
C++版本KMP算法(包含next数组)_第1张图片
代码:

	int* getnext(string p){
    int* next = new int[p.length()];
    next[0] = -1,next[1] = 0;
    for(int i = 2;i<(int)p.length();i++){
        
        int cur = next[i-1];
        while(p[i-1]!=p[cur]&& cur!=-1){  //不相等继续找,像看门牌一样
            cur = next[cur];
        }
        
        next[i] = cur +1;  //找到和-1的情况,-1也被算到了这种情况 -1+1=0就是前缀长度为0
        //cout<
    }
    return next;
}

测试结果:
C++版本KMP算法(包含next数组)_第2张图片
kmp:

int kmp(string a,string p){
    int a_index = 0;
    int p_index = 0;
    int *next= getnext(p);
    // for(int i = 0;i < p.length();i++){ //测试next数组对不对
    //     cout<
    // }

    while(a_index < (int)a.length() && p_index < (int)p.length()){
        

        if(a[a_index] == p[p_index] || p_index == -1){    //p_index = -1表示子串第一个就不匹配,字串要从下标0重新开始和主串的下一个比较,
            a_index++;
            p_index++;
        }
        else{
            p_index = next[p_index];
            
            
        }
        //cout<<"a_index"<

    }

        if(p_index == (int)p.length())
            return a_index - (int)p.length();
    
        return -1;
}

测试结果:
C++版本KMP算法(包含next数组)_第3张图片
总代码:

#include 
#include 
using namespace std;

int* getnext(string p){
    int* next = new int[p.length()];
    next[0] = -1,next[1] = 0;
    for(int i = 2;i< p.length();i++){
        
        int cur = next[i-1];
        while(p[i-1]!=p[cur]&& cur!=-1){  //不相等继续找,像看门牌一样
            cur = next[cur];
        }
        
        next[i] = cur +1;  //找到和-1的情况,-1也被算到了这种情况 -1+1=0就是前缀长度为0
        //cout<
    }
    return next;
}

int kmp(string a,string p){
    int a_index = 0;
    int p_index = 0;
    int *next= getnext(p);
    // for(int i = 0;i < p.length();i++){ //测试next数组对不对
    //     cout<
    // }

    while(a_index < (int)a.length() && p_index < (int)p.length()){
        

        if(a[a_index] == p[p_index] || p_index == -1){    //p_index = -1表示子串第一个就不匹配,字串要从下标0重新开始和主串的下一个比较,
            a_index++;
            p_index++;
        }
        else{
            p_index = next[p_index];
            
            
        }
        //cout<<"a_index"<

    }

        if(p_index == (int)p.length())
            return a_index - (int)p.length();
    
        return -1;
}

 int main ()
{   
    string a = "qweabcdabce";
    string p = "abcdabce"; 
    string b = "dabe";

    
    cout<<kmp(a,p)<<endl;
    cout<<kmp(a,b)<<endl;
    
    return 0;
}

你可能感兴趣的:(算法,c++,数据结构)