AcWing | KMP字符串

本文介绍了KMP算法,用于查找模板串P在模式串S中的所有起始位置。通过求解next数组来减少匹配次数,提高效率。举例说明了KMP算法的工作原理,并提供了时间复杂度分析及代码实现。
摘要由CSDN通过智能技术生成

怕什么就要直面什么!我就要现在开始写题解!!!


题目描述

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

模板串P在模式串S中多次作为子串出现。

求出模板串P在模式串S中所有出现的位置的起始下标。

输入格式

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

第二行输入字符串P。

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

第四行输入字符串S。

输出格式

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

1≤N≤105

1≤M≤106

输入样例:

3
aba
5
ababa

输出样例:

0 2

思路:

  • 经典的kmp算法中最关键的就是求next数组了
  • next数组的本质就是求相应长度子串的最大前缀后缀相同的值。
  • 得到next数组以后,在重新匹配下一个环节的时候,能减少重新匹配的次数,也就是不用从头开始匹配。
  • 举个例子来理解:

被匹配串 S=[ababcababefd]
模板串:P=[ababefd]

  • 当匹配到下标为4的字符时,S[4]=‘c’,P[3+1]=‘e’,(下标分别从1和0开始)两者不匹配了,最朴素的做法是将P[0]对准S[1]从头开始匹配对吧?但是显然是不可能匹配成功的,KMP的做法就是让P[0]直接跳到S[2]开始匹配,才有可能配对成功。
  • 为啥是S[2]呢?这个时候其实就是从P的next[3]=2的来的 ,再来深化一下next求的是P子串里面前缀后缀相等的最大长度:
P的子串 最大匹配前缀 最大匹配后缀 next数组
a \ \ next[0]=0
ab a b next[1]=0
aba a a next[2]=1
abab ab ab nect[3]=2
ababe \ \ next[4]=0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值