zoukankan      html  css  js  c++  java
  • KMP字符匹配算法

    上个假期就学了KMP,但是基本不用,所以忘干净了。。。这个的核心思想就是next数组,next数组学名叫最长相同前缀后缀。还不错的算法,KMP

    匹配的过程中比原来的暴力匹配多了一个跳来跳去的next。

    下面有一个链接:从头到尾KMP,写的很棒,很好懂!

    贴板子代码:(自己写的注释,有可能不对,欢迎指出)

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    using namespace std;
    int next[1000005];
    char s[1000005];//s为匹配串 
    char t[1000005];//t为文本串 
    int ans[1000005];//记录答案 
    int main()
    {
        scanf("%s%s",t + 1,s + 1);//从1开始存 
        int ls = strlen(s + 1);
        int lt = strlen(t + 1);
        int k = 0;//k为所匹配到的最大的后缀
        next[1] = 0;
        for(int i = 2;i <= ls;i++)//开始匹配s,建next数组 
        {
            while(k != 0&&s[i] != s[k + 1])  //后缀不相等则回到next[k] 
            k = next[k];
            if(s[i] == s[k + 1])k++;  //后缀相等 
            next[i] = k;
        }
        k = 0;
        int num = 0;
        for(int i = 1;i <= lt;i++)//开始匹配文本串 
        {
            while(k != 0&&t[i] != s[k + 1])
            k=next[k];
            if(t[i] == s[k + 1])k++;
            if(k == ls)//如果文本串中都已经匹配到s了,记录答案 
            {
                num++;
                ans[num] = i - ls + 1;
            }
        }
        for(int i = 1;i <= num;i++)
        printf("%d
    ",ans[i]);
        for(int i = 1;i <= ls;i++)
        printf("%d ",next[i]);//输出答案 
        return 0;
    }
  • 相关阅读:
    怎么安装Python?
    Ramnit蠕虫病毒分析和查杀
    Exphub[漏洞利用脚本库]
    SMBv3远程代码执行漏洞复现(CVE-2020-0796)
    Tomcat AJP 文件包含漏洞复现(CVE-2020-1938)
    Fastjson远程代码执行漏洞复现
    信息收集之——旁站、C段
    Redis未授权访问漏洞复现与利用
    CSS
    MVC控制器路由
  • 原文地址:https://www.cnblogs.com/DukeLv/p/9345527.html
Copyright © 2011-2022 走看看