zoukankan      html  css  js  c++  java
  • 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");
    }
    

      

  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/kind064100611/p/4420409.html
Copyright © 2011-2022 走看看