考虑枚举回文中心,然后向两边扩展,当匹配到当前串的边界的时候,枚举下一个串接上。 这个过程可以通过记忆化搜索来完成,设: $f[i][0]$表示对于$i$这个位置,$[i,串结尾]$等待匹配的最长回文子串。 $f[i][1]$表示对于$i$这个位置,$[串开头,i]$等待匹配的最长回文子串。 如果在 ...
分类:
其他好文 时间:
2016-09-21 06:49:07
阅读次数:
135
题目:给定一个字符串s,找出s中的最长回文子串; 暴力法,DP法, 中心扩展法,manacher算法 解法一:暴力法 遍历字符串S的每一个子串,去判断这个子串是不是回文,是回文的话看看长度是不是比最大的长度maxlength大。遍历每一个子串的方法要O(n^2),判断每一个子串是不是回文的时间复杂度 ...
分类:
其他好文 时间:
2016-09-17 13:28:30
阅读次数:
209
问题描述: 给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 。 思路分析: 动态规划的思路:dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串。 则根据回文的规则我们可以知道: 如果s[i] == s[j] 那么是否是回文决定于 ...
分类:
其他好文 时间:
2016-09-14 20:41:45
阅读次数:
131
转载:https://www.felix021.com/blog/read.php?2040 首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号。比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#。 为了进一步减 ...
分类:
编程语言 时间:
2016-09-04 17:17:22
阅读次数:
204
求最长回文子串: 回文串是指正着读和反过来读都一样的字符串。 方法: 1. 为了统一解题方法,避免字符串长度奇偶对解题方法的影响,加入了填充字符。若原来的字符串长度为n,则新的字符串长度为2n+1。 2. pos+p[pos] 表示的是目前所有回文子串中,向右达到的最远位置。 3. 先利用对称性,找 ...
分类:
其他好文 时间:
2016-08-31 00:45:22
阅读次数:
156
manacher:可以解决最长回文问题。
算法:1.首先,将字符串的每个字符左右加入#,并在s0位置加入*(如果字符串中本身含有这些,则换成未出现过的字符),此时字符串的长度为len+len+3,即加...
分类:
编程语言 时间:
2016-08-29 15:38:32
阅读次数:
535
求最长回文子串的裸题,搞竞赛的时候遇到过各种花样的变式。
n方的朴素算法已经烂大街了,推荐使用O(n)的算法,只可惜很久没用过manacher算法,不会写了,所以花了一段时间温故知新。
manacher算法原理不了解的道友可以看这篇文章:...
分类:
其他好文 时间:
2016-08-24 15:54:14
阅读次数:
167
manacher、一个串切割成5个回文子串、优化
第一次使用manacher 嘿嘿??
为了方便处理奇偶的情况, 我们把 区间 [ i , j ] 的回文子串半径保存在 len[ i + j ] 里,
if(len[ i + j ] >= (j - i)/2 + 1) 则[ i , j ] 为回文串
可以O(n)的处理出len 所有中心的回文子串长度
这里先跑一边 manacher(n) 得到 len[]数组
然后O(n) 的预处理出 第一个字符串的右端点 i,放在一个队列里
并且O(n) 的预处理出 最...
bzoj2160拉拉队排练 题意: 给一个字符串,求最长的k个回文子串(此处回文子串长度必须为奇数)长度的乘积。字符串长度≤1000000 题解: 先用manacher预处理出第i个字符为中心的最长回文子串一端长度p[i],然后cnt[1]++,cnt[2*p[i]+1]--,最后cnt[i]+=c ...
分类:
其他好文 时间:
2016-08-17 22:38:11
阅读次数:
118