首页 > 其他分享 >KMP

KMP

时间:2023-11-30 12:33:05浏览次数:31  
标签:匹配 int 算法 KMP 字符串 输入

一、算法描述

本篇文章水平不够,讲不清楚KMP到底是怎么回事,以后再更新一下。

本篇文章讲述的是KMP算法, 一个著名的字符串匹配算法,效率很高,\(O(n)\) 的时间复杂度。

难点在于:如何理解 \(next[i]\) ★★★

\(ne[i] = j\) 表示,\(p[1 ~ j] = p[i - j + 1, i]\),从 \(1\) 到 \(j\) 的前缀串,完全等于,从 \(i - j + 1\) 到 \(i\) 的后缀串。

当匹配道某一位置时,下一个位置不匹配,此时为了节约时间,我们要找到一个位置,使得,匹配不成功的点能够继续匹配

暴力做法是往后移动一位,而KMP是直接滑到能够滑到的最远的位置,或者说最少回退多少能够继续匹配。

二、题目描述

给定一个字符串 \(S\),以及一个模式串 \(P\),所有字符串中只包含大小写英文字母以及阿拉伯数字。

模式串 \(P\) 在字符串 \(S\) 中多次作为子串出现。

求出模式串 \(P\) 在字符串 \(S\) 中所有出现的位置的起始下标。

输入格式

第一行输入整数 \(N\),表示字符串 \(P\) 的长度。

第二行输入字符串 \(P\)。

第三行输入整数 \(M\),表示字符串 \(S\) 的长度。

第四行输入字符串 \(S\)。

输出格式

共一行,输出所有出现位置的起始下标(下标从 \(0\) 开始计数),整数之间用空格隔开。

数据范围

\(1≤N≤10^5\)
\(1≤M≤10^6\)

输入样例:

3
aba
5
ababa 

输出样例:

0 2 

三、题目来源

AcWing算法基础课-831.KMP字符串

四、源代码

#include <iostream>

using namespace std;

const int N = 100010, M = 1000010;

int n, m;
char p[N], s[M];
int ne[N];

int main()
{
    cin >> n >> p + 1 >> m >> s + 1;
    
    for (int i = 2, j = 0; i <= n; ++i)
    {
        while (j && p[i] != p[j + 1])   j = ne[j];
        if (p[i] == p[j + 1])   ++ j;
        ne[i] = j;
    }
    
    for (int i = 1, j = 0; i <= m; ++i)
    {
        while (j && s[i] != p[j + 1])   j = ne[j];
        if (s[i] == p[j + 1])   j ++ ;
        if (j == n)
        {
            cout << i - n << ' ';
            j = ne[j];
        }
    }
    
    return 0;
}

标签:匹配,int,算法,KMP,字符串,输入
From: https://www.cnblogs.com/grave-master/p/17865752.html

相关文章

  • P3375 【模板】KMP( 普及/提高− ) 题解
    题目传送门思路:首先我们要学习一下\(KMP\)算法,不会的可以看这个大佬的文章那么我们就直接开始讲思路了。针对于每一位,\(kmp\)算法已经预处理出了一个对应\(kmp\)数组的单元,映射着如果此位失配,它可能的最靠后的一个重新开头是哪一个。让我们举一个例子:假如让\(aaab\)与......
  • KMP算法
    #include<iostream>usingnamespacestd;int*getNext(stringpattern){int*next=(int*)malloc(sizeof(int)*pattern.size());if(next==NULL){returnNULL;}next[0]=-1;intj=-1;for(inti=1;i<p......
  • KMP板子
    updateon2023.11.17NOIP前来复习板子,发现KMP整理的不是很到位,所以更新详细一些。模板题抽象的blog浅显易懂的讲解视频:(dalao讲得太好了\(%%%\))备用网址\(kmp\)(字符串匹配)的概念:主串:被匹配的字符串模式串:匹配的串最长前后缀:一个字符串某个前缀后后缀相同,而且长度尽可......
  • KMP与自动机
    KMP与AC自动机都是字符串匹配KMP是单模匹配ac自动机是多模匹配KMP原理例子当我们匹配字符串A(长度为n)中是否有B(长度为m,m<n)的时候比如:AABCDABCDEFBABCDE一个朴素的思路是暴力,复杂度当然是O(n*m)KMP就是一个优化的算法KMP的理论基础就是,并不是每次匹......
  • KMP模板
    #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e3+10,inf=0x3f3f3f3f;intnex[N];//nex[j]的意思是当子串的第j个字符和主串的第i个字符不匹配时,我们应该从子串的nex[j]字符开始重新匹配stringa,b;/*kmp指针回退j=nex[j-1]......
  • 扩展 KMP——Z 函数
    本文下标从\(0\)开始。建议:前置知识。扩展KMP(Z函数)我们已经认识了前缀函数了。它是维护一个字符串的所有前缀的最长公共真前后缀的长度——\[\overbrace{s_0\dotss_{\pi(i)-1}}~s_{\pi(i)}\dotss_{i-\pi(i)}~\overbrace{s_{i-\pi(i)+1}\dots\color{red}s_i}~s_{i+1}......
  • kmp算法
    2023-11-14作用:从一个字符串中找到另一个字符串的位置思路:    暴力匹配-》主串的指针一直往前走,不后退-》匹配串的指针回退的位置变小-》根据前缀表 求前缀表(匹配串的所有前缀的最长公共前后缀长度表):/求前缀表int[]next=newint[needle.length()];......
  • RKMPP 硬编码之mpi_enc_test .c解析
    一.简介mpi_enc_test是rockchip官方编码demo本篇文章进行mpi_enc_test的代码解析,编码流程解析二.环境介绍硬件环境:ArmSoM-W3RK3588开发板软件版本:OS:ArmSoM-W3Debian11三.mpp编解码流程解析<center>图3.1RKMPP编码器接口为用户提供了输入图像数据,输出码......
  • 字符串匹配算法:KMP
    Knuth–Morris–Pratt(KMP)是由三位数学家克努斯、莫里斯、普拉特同时发现,所有人们用三个人的名字来称呼这种算法,KMP是一种改进的字符串匹配算法,它的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。它的时间复杂度是O(m+n)字符匹配:给你两个字符......
  • AI问答:关于字符串匹配算法的区别及应用场景,哈希/kmp/字典树/AC自动机
    1. 哈希(Hashing):哈希是一种将字符串转换为唯一标识符的技术,通常用于字符串的快速查找和比较。实现难度相对较低,但需要处理哈希冲突的问题。哈希在处理大量数据的查找和比较问题时非常实用。2. KMP(Knuth-Morris-Pratt):KMP 是一种用于字符串匹配的算法,特别适用于查找子串在主串中的......