• KMP算法


    在看string的find函数时,本来想看看find的效率如何,突然发现kmp算法有点忘了,做个笔记。

    看了几个blog感觉不是很有感觉(主要是标号和我学的不一样,不习惯),看了严蔚敏的视频,把感觉找回来了。

    next[j]的值就是j之前字符串与最开始字符串的最长匹配字符串的长度+1。

    找了严蔚敏的几个测试实例测了一下,发现全对,说明我对next函数了解了。

    随便贴个代码:

    //next[0] 初始化为-1 next[1]初始化为0
    //next[j]的值就是j之前字符串与最开始字符串的最长匹配字符串的长度。
    //也就是说比严蔚敏示例的next值都小1,比较符合字符串从0开始的习惯。
    #include<iostream>
    using namespace std;
    
    void getnext(char s2[],int next[])
    {
        memset(next,0,sizeof(next));
        int i=-1,j=0;
        next[0]=-1;
        while(j<strlen(s2))
        {
            if(i==-1||s2[i]==s2[j])
            {
                i++; 
                j++;  
                next[j]=i;
            }
            else 
                i=next[i];
        }
    }
    
    int KMP(char s1[],char s2[],int next[])
    {
        int i=0,j=0,len1=strlen(s1),len2=strlen(s2);
        while((i<len1)&&(j<len2))
        {
            if(j==-1||s1[i]==s2[j])
            {
                i++;
                j++;
            }
            else 
                j=next[j];
        }
        if(j==len2) 
            return i-len2;
        else 
            return -1;
    }
    
    void main()
    {
        char s1[200] = "aaaabbbbaabaaabaaaabbbbb",s2[200] = "aabaaabaaaab"; //-1 0 1 0 1 2 2 3 4 5 6 2
        int next[200];
        getnext(s2,next);
        for (int i = 0; i<12; i++)
        {
            cout<<next[i]<<" ";
        }
        cout<<endl;
        cout<<KMP(s1,s2,next)<<endl;
        system("pause");
    }
    

      

  • 相关阅读:
    POJ 1006 ( 中国剩余定理 )
    HDU 2736 Surprising Strings
    STL----map 章节
    最短路问题
    [HAOI2007]反素数
    严格次小生成树[BJWC2010]
    P3320 [SDOI2015]寻宝游戏(LCA)
    [Violet]樱花/阶乘分解
    [HNOI2008]GT考试
    2012 年国家集训队互测 Tree
  • 原文地址:https://www.cnblogs.com/kind064100611/p/4420409.html
Copyright © 2020-2023  润新知