zoukankan      html  css  js  c++  java
  • KMP简提

    KMP是一种复杂度为O(n+m)的字符串匹配算法,最难理解的部分就是Next数组的求解

    Next数组即为模板串的每个位置对应的 0~i 位置的前缀与后缀中的最大公共部分,依此公共部分来实现模板串的移动匹配,依此大幅度降低了字符串匹配的复杂度。

    Next数组的其实就是对模板串相同前缀后缀的一个递归匹配实现。

    推荐一个理解Next数组的博客:https://www.cnblogs.com/tangzhengyue/p/4315393.html

    附上代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+10;
    int Next[maxn],f[maxn];
    
    void get_Next(string p){
        Next[0]=0;
        for (int i=1,j=0; p[i]; i++){
            while(j>0 && p[j]!=p[i]) j=Next[j-1];
            if(p[i] == p[j]) j++;
            Next[i]=j;
    //        printf("%d ",j);
        }
    }
    int Kmp(string t,string p){
        int ans=0,len=t.length(),l=p.length();
        for (int j=0,i=0; i<len; i++){
            while(j>0 && t[i]!=p[j]) j=Next[j-1];
            if(t[i]==p[j]) j++;
            f[i]=j;
            if(f[i]==l) ans++,j=Next[j-1];
        }
        return ans;
    }
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+10;
    struct KMP{
        int Next[maxn],f[maxn];
        void get_Next(string p){
            Next[0]=0;
            for (int i=1,j=0; p[i]; i++){
                while(j>0 && p[j]!=p[i]) j=Next[j-1];
                if(p[i] == p[j]) j++;
                Next[i]=j;
            }
        }
        int Kmp(string t,string p){
            int ans=0,len=t.length(),l=p.length();
            for (int j=0,i=0; i<len; i++){
                while(j>0 && t[i]!=p[j]) j=Next[j-1];
                if(t[i]==p[j]) j++;
                f[i]=j;
                if(f[i]==l) ans++,j=Next[j-1];
            }
            return ans;
        }
    }kp;
  • 相关阅读:
    Redis-数据类型
    文件转二进制流拆分与组装
    word 文件转PDF 预览
    查询数据库还原时间
    Window10主机连接到Docker 中的mysql 数据库
    sqlServer 执行存储过程结果存表中
    启动mysql 镜像
    Java类型转换细节
    IDEA常用插件
    IDEA控制台中文乱码
  • 原文地址:https://www.cnblogs.com/acerkoo/p/9490301.html
Copyright © 2011-2022 走看看