概念明确:被匹配串、匹配串。如从cbabce找ab,前者和后者分别称为被匹配串、匹配串。 最容易想到的方法:从首字母开始,逐个比较下去。一旦发现有不同的字符就停止并将这个匹配串后移一位,然后从头开始进行下一次比较。这样,就需要将字串中的所有字符一一比较。 KMP算法 Boyer-Moore算法 基于 ...
分类:
编程语言 时间:
2019-11-26 13:35:29
阅读次数:
76
KMP总结 什么是KMP? KMP算法,又称为模式匹配算法,能够在线性时间内判定字符串 $A[1$~$N]$ 是否为字符串 $B[1$~$M]$ 的子串,并求出字符串 $A$ 在字符串 $B$ 中各次出现的位置。(from 李煜东《算法竞赛进阶指南》) 如何进行KMP? 第一步: $A$串进行自我匹 ...
分类:
其他好文 时间:
2019-11-24 13:54:45
阅读次数:
62
```cpp int pi[1005]; void GetPrefixFunction(char *s, int sl) { pi[0] = 0, pi[1] = 0; for(int i = 1, k = 0; i < sl; ++i) { while(k && s[i] != s[k]) k =... ...
分类:
编程语言 时间:
2019-11-21 13:46:42
阅读次数:
50
一、KMP算法介绍 KMP算法与前面的MP算法一脉相承,都是充分利用先前匹配的过程中已经得到的结果来避免频繁回溯。回顾一下MP算法,如下图的模式串偏移,当前模式字符串P的左端的p0与目标字符串T中tj位置对齐。从左向右逐个进行比较,发现 pi 处的字符a 与 tj+1 处字符b发生失配。同时也表明 ...
分类:
编程语言 时间:
2019-11-12 00:41:43
阅读次数:
68
前言 本篇博客的字符串下标是从1开始的。 引入 给出两个字符串$A,B$,询问$B$是否是$A$的子串。 对于以上问题,我们有一个比较暴力的想法,就是一位一位去配对呀。 给出代码: cpp int Check(){ for(int i=1;i+M 1 include include using na ...
分类:
编程语言 时间:
2019-11-08 21:12:18
阅读次数:
123
题目链接:https://vjudge.net/problem/POJ-2185 题意:给定由大写字母组成的r×c矩阵,求最小子矩阵使得该子矩阵能组成这个大矩阵,但并不要求小矩阵刚好组成大矩阵,即边界部分可以空缺(见样例)。 思路: 把每一行视作一个字符,然后对r行求next数组,那么r-nex[r ...
分类:
编程语言 时间:
2019-11-05 13:48:25
阅读次数:
80
题目链接: "http://acm.hdu.edu.cn/showproblem.php?pid=3746" 题目大意:给你一个串 $s$ ,要求 $s$ 的开头或结尾添加最少的字符,使得添加后的串可以表示为 $K$ 个相同的子串的拼接 $(K =2)$ 。 题目分析:首先如果这个串s已经是一个循环 ...
分类:
编程语言 时间:
2019-11-04 22:07:11
阅读次数:
101
题目链接:https://vjudge.net/problem/HDU-3746 题意:给定一个字符串,问最少在两端添加多少元素使得整个字符串是呈周期性的。 思路: 应用到kmp中nex数组的性质,数组的最小循环节是L=len-nex[len],证明见http://www.cnblogs.com/w ...
分类:
编程语言 时间:
2019-11-03 18:27:00
阅读次数:
118
题目链接:https://vjudge.net/problem/HDU-3336 题意:给定长为n(<=2e5)的字符串s,求s的每个前缀在s中出现的次数之和。 思路: 用dp[i]表示以s[i]为结尾的子串是s的某一种前缀的方案数,那么dp[i]=dp[nex[i]]+1,因为[nex[i]-(i ...
分类:
编程语言 时间:
2019-11-03 16:47:05
阅读次数:
61
题目链接:https://www.luogu.org/problem/P5410 题意:有两个字符串a,b,要求输出b与a的每一个后缀的最长公共前缀。输出: 第一行有lenb个数,为b的next数组(特别地,next1为lenb) 第二行有lena个数,即答案。 思路:扩展kmp模板,涉及字典树,后 ...
分类:
编程语言 时间:
2019-11-03 13:07:34
阅读次数:
92