2472:不重叠回文子字符串的最大数目(2013 分)
目录
题目
给你一个字符串 s 和一个 正 整数 k 。
从字符串 s 中选出一组满足下述条件且 不重叠 的子字符串:
- 每个子字符串的长度 至少 为
k。 - 每个子字符串是一个 回文串 。
返回最优方案中能选择的子字符串的 最大 数目。
子字符串 是字符串中一个连续的字符序列。
示例 1 :
输入:s = "abaccdbbd", k = 3 输出:2 解释:可以选择 s = "abaccdbbd" 中斜体加粗的子字符串。"aba" 和 "dbbd" 都是回文,且长度至少为 k = 3 。 可以证明,无法选出两个以上的有效子字符串。
示例 2 :
输入:s = "adbcda", k = 2 输出:0 解释:字符串中不存在长度至少为 2 的回文子字符串。
提示:
1 <= k <= s.length <= 2000s仅由小写英文字母组成
相似问题:
- 0005:最长回文子串
- 0131:分割回文串
- 0132:分割回文串 II
- 1278:分割回文串 III(1979 分)
- 1520:最多的不重叠子字符串(2362 分)
- 1745:分割回文串 IV(1924 分)
分析
#1
- 令 f(i) 代表 s[:i] 的最大数目,容易写出递推式
- f(i) = max(f(i-1),1+max(f(j) for j in range(i) if i-j>=k and s[j:i] 回文))
- 注意到>=k+2 的子串无意义,只需要枚举 j=i-k 和 j=i-k-1 即可
|
|
19 ms
#2
- 判断区间是否回文还可以用 manacher 预处理
解答
|
|
31 ms