最长公共字符串(KMP)

这里写代码片

KMP:

#include<cstdio>
#include<cstring>
#include<iostream>
#include <vector>
using namespace std;
#define N 100
int nxt[N];  


int CreateNext(int start,int len,string &srcstr,string &matchstr){
    memset(nxt,0,sizeof(nxt));
    for(int i=start;i<start+len;++i){
        matchstr+=srcstr[i];    //取出匹配样本的某一子串 
    }
    cout<<"matchstr: "<<matchstr<<endl;

    nxt[0]=0;  
    //int q,k;
    for (int q = 1,k = 0; q < matchstr.length(); ++q)
    {
        while(k > 0 && matchstr[q] != matchstr[k]) 
            k = nxt[k-1];
        if (matchstr[q] == matchstr[k])
            k++;
        nxt[q] = k;
    }

    for(int i=0;i<matchstr.length();i++)
        cout<<nxt[i];
    cout<<endl;
    return 0;
}


inline int KMP(string &str,string &matchstr){
    //int i=0,q=0;
    for(int i=0,q=0;i<str.length();++i){
        while(q>0 && str[i] != matchstr[q]){
            q=nxt[q-1];
        }
        if(str[i] == matchstr[q]){
            ++q;
        }
        if(q==matchstr.length()){
            printf("Pattern occurs with shift:%d\n",(i-matchstr.length()+1));
            return 1;
        }
    }
    return 0;
}


bool Check(vector<string> &vec,string &matchstr){
    for(int i=0;i<vec.size();i++){
            if(!KMP(vec[i],matchstr)) return false;
    }
    return true;
}


int main(){
    int n;
    cout<<"输入字符串个数: ";
    cin>>n; 

    int minlen=-1;
    int minpos;
    string str,shortest_str="";
    vector<string> vec;
    for(int i=0;i<n;i++) {
        cin>>str;
        if(minlen==-1 || minlen>str.length()){          
            if(shortest_str!="") 
                vec.push_back(shortest_str);
            shortest_str=str;
            minlen=str.length();
        }else{
            vec.push_back(str);
        }       
    }

    bool flag=0;
    string allmatchstr="";
    for(int i=minlen;i>0;--i){  //i表示所需匹配的字符串的长度 
        for(int j=0;j<=minlen-i;++j){   //j表示所需匹配字符串的起始位置,从最长len开始找 
            cout<<"start:"<<j<<" to:"<<j+i<<" len:"<<i<<endl;
            string matchstr="";
            CreateNext(j,i,shortest_str,matchstr);
            if(Check(vec,matchstr)) {
                cout<<"find: "<<matchstr<<endl;
                if(!flag){
                    flag=1;
                    allmatchstr+=matchstr; 
                }
                else 
                    allmatchstr+=+","+matchstr;
                continue;
                //return 0;
            }  
        }
        if(flag) break;
    } 
    cout<<"All match longest substring:"<<endl;
    cout<<allmatchstr<<endl;
    return 0;
}
    原文作者:KMP算法
    原文地址: https://blog.csdn.net/llss159753258456/article/details/78322150
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞