kmp算法的改进(C++)

#include<iostream>
#include<string>
#include<cmath>
#include<malloc.h>
using namespace std;
int Search_KMP(string,string,int*);
void nextval(string T,int len,int *);//len表示模式串T的长度,且模式串从0 
int main(void)
{
    string S,T;//S为主串,T为模式串 
    cout<<"请输入主串:";
    cin>>S;cout<<endl;
    cout<<"请输入模式串:";
    cin>>T;cout<<endl;
    int *next=(int *)malloc(sizeof(int)*S.length());next[0]=0;//存前缀和后缀的个数。 
    nextval(T,T.length(),next);
    Search_KMP(S,T,next);
    return 0;
}
int Search_KMP(string S,string T,int *next)
{
    int i=0,j=0;
    int len_s=S.length(),len_t=T.length();
    while(i<len_s&&j<len_t)
    {
        if(S[i]==T[j])
        {
            i++;
            j++; 
        }
        else
        {
              if(j!=0)
            {
                j=next[j-1];
            }
            else
            {
                i++;
            }  
        }
    }
    if(j==len_t)
    {
        cout<<"查找成功,位置为s串中的第:"<<i-j+1<<"位"<<endl;
    }
    else
    {
        cout<<"查找失败!"<<endl; 
    }
}
void nextval(string T,int len,int *next)
{
    int i=0,j=1;
    next[0]=0;
    while(j<len)
    {
        if(T[i]==T[j])
        {
            next[j]=i+1;
            j++;i++;
        }
        else
        {
            if(i!=0)
            {
                i=next[i-1];    
            }
            else
            {
                next[j]=0;
                j++;
            }   
        }
     } 
} 






最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容