zoukankan      html  css  js  c++  java
  • KMP算法

    今天又被科普了一下:kmp——k(kan)m(mao)p(pian)

    其实说实话,这个字符串算法理解起来还是非常的困难的,而且我在网上看到的一些资料都是各说各的,仿佛都很有道理,但是都写得还不够全面,所以学习这一板板块得知识,我是自己看的视频,这里我就推荐几个,大家可以在B站上搜一搜,其实都讲的还是非常的好的,“小甲鱼的数据结构”还有B站搜KMP算法的第一篇。

    题目传送门:P3375 【模板】KMP字符串匹配

    AC代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    char a[1000100],b[1000100];
    int next[1000100];
    int main()
    {
        scanf("%s%s",a+1,b+1);
        int la=strlen(a+1),lb=strlen(b+1);
        int j=0;
        next[1]=0;
        //先处理出next数组,无非是b和自己匹配,与b和a匹配一样,故代码差不多
        for(int i=2;i<=lb;i++)
        {
            while(j>0 && b[i]!=b[j+1]) j=next[j];//往前翻记录了有相同前缀的j
            if(b[i]==b[j+1]) j++;//i匹配成功了,i继续往后 
            next[i]=j;//更新当前的next数组 
        }
        j=0;
        for(int i=1;i<=la;i++)
        {
        	while(j>0 && a[i]!=b[j+1]) j=next[j];
            if(a[i]==b[j+1]) j++;
            if(j==lb) printf("%d
    ",i-lb+1),j=next[j];//虽然成功匹配但是可以把他当作成并没有成功匹配 
        }
        for(int i=1;i<lb;i++)
            printf("%d ",next[i]);
        printf("%d",next[lb]);
        return 0;
    }
    

    by njc

  • 相关阅读:
    JS系统函数
    匿名函数
    使用递归计算1~n之间所有整数的和
    交换两个变量的值
    创建函数,传递一个数字n,返回斐波那契数列的第n的值。
    创建函数function
    打印本世纪(2000~2100)的前10个闰年
    打印九九乘法表
    计算1~100之间所有整数的和
    循环执行
  • 原文地址:https://www.cnblogs.com/mudrobot/p/13329390.html
Copyright © 2011-2022 走看看