前言
本文对算法竞赛中可能涉及字符串算法做一个功能说明。
1.Trie(字典树)
算法功能:判断一个字符串在模式串中出现的次数
例题1:维护一个字符串集合,支持两种操作:
I x 向集合中插入一个字符串 x;
Q x 询问一个字符串在集合中出现了多少次。
2.KMP
算法功能:线性复杂度求匹配串在模式串出现的位置
例题1:给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串 P 在模式串 S 中多次作为子串出现。求出模板串 P 在模式串 S 中所有出现的位置的起始下标。
3.Boyer-Moore算法
算法功能:线性复杂度求匹配串在模式串出现的位置
与KMP功能相同但是速度是其3-5倍
4.Z函数(扩展KMP)
算法功能:求对于原串S1的每一个后缀子串与模式串S2的最长公共前缀
例题1:Passwrod
例题2:给定一个长度为n 的字符串s,找到其最短的整周期,即寻找一个最短的字符串t ,使得 可以被若干个t 拼接而成的字符串表示。
5.AC自动机
算法功能:多匹配串在模式串出现的次数
例题1:给定 n 个模式串 s i 和一个文本串 t,求有多少个不同的模式串在文本串里出现过。
两个模式串不同当且仅当他们编号不同。
6.后缀数组(SA)
算法功能:主要有两个数组,通过sa[i]表示将所有后缀排序后第 小的后缀的编号,rank[i]表示后缀 i的排名,也就是通过这两个数组你可以知道排名第几的后缀字符串是谁,并且可以知道一个字符串排名第几。
算法应用:
1.寻找最小的循环移动位置
2.从字符串首尾取字符最小化字典序
3.求LCP(最长公共前缀)
7.后缀自动机(SAM)
算法功能:
1.在另一个字符串中搜索一个字符串的所有出现位置。
2.计算给定的字符串中有多少个不同的子串。
3.字典序第 k 大子串
4.最小循环移位
5.最短的没有出现的字符串
6.两个字符串的最长公共子串
7.所有不同子串的总长度
8.子串出现次数
9.多个字符串间的最长公共子串
例题1:SAM模板
8.后缀平衡树
其中序遍历即为后缀数组。
优点:
1.后缀平衡树的复杂度不依赖于字符集的大小
2.后缀平衡树支持在字符串开头删除一个字符
3.后缀平衡树可持久化
例题1:后缀平衡树模板
例题2:后缀排序
9.广义后缀自动机
后缀自动机 (suffix automaton, SAM) 是用于处理单个字符串的子串问题的强力工具。
而广义后缀自动机 (General Suffix Automaton) 则是将后缀自动机整合到字典树中来解决对于多个字符串的子串问题
例题1:本质不同字串
10.Manacher(马拉车)
算法功能:线性复杂度找到字符串中所有的回文子串
例题1:给定一个长度为 n 的由小写字母构成的字符串,求它的最长回文子串的长度是多少。
11.回文树
算法功能:回文树 (EER Tree,Palindromic Tree,也被称为回文自动机)是一种可以存储一个串中所有回文子串的高效数据结构,使用回文树可以简单高效地解决一系列涉及回文串的问题。
例题1:回文串
12.序列自动机
算法功能:
下面,给两个小写字母串A ,B请你计算:
A 的一个最短的子串,它不是B 的子串
A 的一个最短的子串,它不是 B 的子序列
A的一个最短的子序列,它不是 B的子串
A的一个最短的子序列,它不是 B的子序列
例题1:最短不公共子串
13.最小表示法
字符串 S的最小表示为与 S循环同构的所有字符串中字典序最小的字符串
14.Lyndon 分解
将字符串s唯一分解为若干个简单串
简单串是字典序小于所有后缀串的字符串
15.Main-Lorentz 算法
问题描述:
给定一个长度为n 的字符串 s。
我们将一个字符串连续写两遍所产生的新字符串称为 重串 (tandem repetition)。下文中,为了表述精准,我们将被重复的这个字符串称为原串。换言之,一个重串等价于一对下标 (i,j),其使得s[i…j] 是两个相同字符串拼接而成的。
你的目标是找出给定的字符串 s中所有的重串。