您的位置:首页 > 其它

字符串总结

2016-04-18 22:01 225 查看
对于字符串问题除了把处理字符串的工具模板化之外,还要注意每个题目的特殊性,比如哪一段等于哪一段阿,回文串什么的。。最好的办法就是把题目所描述的条件满足了之后看看有什么性质。。

hash;

kmp:

单模式串匹配

trie字典树:

trie树是一棵树可以求lca dfs序

ac自动机:

多模式串匹配 复杂度n*字符集

1.一堆模式串 一个目标串 问模式串在目标串中出现了多少次 基本应用

2.ac/kmp辅助转移dp

3.fail树:

noi2011阿狸的打字机:题目要求是求有多少个y上的fail指针指向x的end节点

显然暴力的做法是将从root到y的路径全部都++之后 在fail树上dp一遍 但是

显然直接查询以x为根的子树的sum是可以做到的 注意ac自动机是由tire树和fail树组成的 两棵单独的树的dfs序都决定了连续的一段是可以维护的(好吧一时间无法说清楚了。。。)

后缀数组:

单个字符串的问题

连续重复串:如果一个字符串L是由某个字符串S重复R次而得到的,则称

L 是一个连续重复串。R是这个字符串的重复次数。

1.给定一个字符串,求重复次数最多的连续重复子串.

先穷举长度L,然后求长度为L的子串最多能连续出现几次。首先连续出现

1 次是肯定可以的,所以这里只考虑至少2次的情况。假设在原字符串中连续出现 2 次,记这个子字符串为 S,那么 S 肯定包括了字符 r[0], r[L], r[L*2],r[L*3], ……中的某相邻的两个。所以只须看字符 r[L*i]和r[L*(i+1)]往前和往后各能匹配到多远,记这个总长度为K,那么这里连续出现了K/L+1次。最后看最大值是多少。

这个题比较经典有点厉害。。

两个字符串的问题

1.给两个字符串,求长度不少于k的公共子串的个数.

多个字符串的问题

2.不小于k个字符串中的最长子串

二分一个长度 然后分组所有height>mid的分成一组 然后看是否满足条件

多个字符串问题

1.给定n个字符串,求出现或反转后出现在每个字符串中的最长子串。

这题不同的地方在于要判断是否在反转后的字符串中出现。其实这并没有加

大题目的难度。只需要先将每个字符串都反过来写一遍,中间用一个互不相同的

且没有出现在字符串中的字符隔开,再将n个字符串全部连起来,中间也是用一

个互不相同的且没有出现在字符串中的字符隔开,求后缀数组。然后二分答案,

再将后缀分组。判断的时候,要看是否有一组后缀在每个原来的字符串或反转后

的字符串中出现。这个做法的时间复杂度为O(nlogn)。

后缀自动机:

可以识别一个字符串的所有后缀,可以对一棵trie树建后缀自动机.

1.T为0则表示不同位置的相同子串算作一个。T=1则表示不同位置的相同子串算作多个.对于一个给定长度为N的字符串,求它的第K小子串是什么.

这个题可以作为后缀数组和后缀自动机的对比题

对于后缀自动机来说 对于不同的T给每个节点赋不同的初值就行了 然后求第k大就在自动机上按照顺序dfs

但是这个题如果用后缀数组做就会很麻烦 后缀数组比较容易解决的是 不同位置的子串算作一个的第k大子串 用sum【i】表示rank排前i个的字符串的个数的前缀和 然后直接二分就好

然而如果查的是不同位置算做多个的话 sum的值就不是很好处理了 比较不可写==

2.给出几个由小写字母构成的单词,求它们最长的公共子串的长度。

显然这是一道后缀自动机和后缀数组都很好写的。

3.在tire树上建后缀自动机 这就比后缀数组好写太多了!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: