1 条题解
-
0
D. 串联重复串? 详细题解
题目核心理解
给定一个由小写字母和问号
?组成的字符串 。 你可以把每个问号替换成任意小写字母。串联重复串定义为:长度为偶数,且前半段与后半段完全相同的字符串。 要求找到替换后,字符串中能出现的最长串联重复子串的长度,无法构造则输出 。
核心思路
1. 关键性质
一段长度为 的子串可以被改成串联重复串,当且仅当: 对于每一对位置 和 ,两个字符相等,或至少有一个是问号。
2. 优化枚举方式
直接枚举所有子串会达到 ,会超时。 正确做法是:
- 先枚举半段长度
- 再用滑动窗口统计合法匹配的数量
- 窗口右移时只需要 更新计数
3. 滑动窗口规则
对于固定的 :
- 初始统计前 对字符的可匹配数量
- 窗口右移一位时:
- 去掉最左侧一对的贡献
- 加入新进入的右侧一对的贡献
- 若 ,说明当前长度为 的子串合法
算法流程
- 初始化答案 。
- 枚举半段长度 ,从 到 。
- 对每个 ,先计算初始窗口的合法匹配对数 。
- 向右滑动窗口,动态维护 。
- 若某一时刻 ,用 更新答案。
- 遍历结束后输出 。
公式与复杂度分析
可匹配条件:
$$s[i] = s[i+d] \ \ \text{或} \ \ s[i]=\,? \ \ \text{或} \ \ s[i+d]=\,? $$合法判定条件:
复杂度
每组测试用例时间复杂度:。 总字符串长度限制 ,因此总运算量约 ,可轻松通过时限。
- 1
信息
- ID
- 6576
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者