zoukankan      html  css  js  c++  java
  • KMP

    KMP这个代码的复杂度是n+m的,但是蛮力法的复杂度是n^2,所以还是提高了

    至于为啥是叫kmp,因为是三个人共同提出的这个算法,将他们三个人的姓氏的首字母合在一起,就叫了这个名字KMP。

    kmp看懂了,但是代码还是不熟练,需要继续巩固,这个代码的理解花了好几个小时,主要参考了两个网站,

    https://www.cnblogs.com/zhangtianq/p/5839909.html  这个网站理解了kmp的思想,然后看了半天的next数组还是不会

    于是就去找了另一个网站看next数组怎么算, https://blog.csdn.net/yutong5818/article/details/81319120  于是参考了这个文章的黑体字部分,理解了next数组怎么求,以及他的意义,这也是kmp代码的核心,也是难点所在。

    //date:2020.4.19
    //参考链接 https://blog.csdn.net/yutong5818/article/details/81319120
    #include <bits/stdc++.h>
    using namespace std;
    void calnext(char s[],int next[])
    {
    int k=0;
    next[0]=0;
    for(int i=1; i<strlen(s); i++)
    {
    while(k>0&&s[i]!=s[k])
    k=next[k-1];
    if(s[i]==s[k])
    k++;
    next[i]=k;
    }
    }
    int kmp(char pipei[],char daipipei[])
    {
    int len1=strlen(pipei);
    int len2=strlen(daipipei);
    int next[len2];
    calnext(daipipei,next);
    for(int i=0,j=0; i<len1; i++)
    {
    while(j>0&&pipei[i]!=daipipei[j])
    j=next[j-1];
    if(pipei[i]==daipipei[j])
    j++;
    if(j==len2)
    return i-j+1;
    }
    }
    int main()
    {
    char t[]="123614561123458412";
    char s[]="611";
    cout<<t<<endl;
    cout<<s<<endl;
    int res=kmp(t,s);
    cout<<"下标为"<<res<<endl;
    return 0;
    }
  • 相关阅读:
    交易是如何被创建和打包的7
    重回js--js中的块作用域
    重回js--立即执行函数
    解决json跨域
    h5开发安卓ios坑总结
    关于html中对换行的处理
    说说display-inline
    笔记--学习git命令(基本命令版)
    写在最开始
    替换多个文件中的部分内容Demo
  • 原文地址:https://www.cnblogs.com/someonezero/p/12732085.html
Copyright © 2011-2022 走看看