1 条题解
-
0
题目大意
给定一个长度为 的字符串 和整数 ,机器人内存存储 个字符,按循环方式执行。统计所有长度至少为 的连续子串中,满足循环模式匹配条件的子串数量。
解题思路
核心思想
双指针 + 循环模式匹配性质
-
循环模式性质:如果一个子串 匹配长度为 的循环模式,那么对于任意位置 ,有 (在有效范围内)
-
双指针扫描:对于每个起始位置 ,找到最远的 使得 满足循环模式条件
-
贡献计算:对于每个 ,满足条件的子串数量为
算法流程详解
1. 循环模式条件
对于子串 要匹配长度为 的循环模式,需要满足:
- 对于所有 ,有
2. 双指针扫描过程
- i:子串起始位置(从左到右扫描)
- j:当前满足循环模式条件的最远位置
对于每个 :
- 将 初始化为 ,保证长度至少为
- 向右扩展 ,只要 就继续扩展
- 当条件不满足时停止,此时 是满足条件的最大子串
3. 贡献计算
对于起始位置 ,满足条件的子串包括:
- 到 的所有子串
- 总数量为:
举例说明
对于样例:
K = 2 s = "zabacabab"扫描过程:
- i=1: j从3开始,扩展失败,贡献 3-1-2=0
- i=2: j从4开始,扩展到5,贡献 5-2-2=1 ("aba")
- i=3: j从5开始,扩展到6,贡献 6-3-2=1 ("aca")
- i=4: j从6开始,扩展到8,贡献 8-4-2=2 ("aba", "abab")
- i=5: j从7开始,扩展到9,贡献 9-5-2=2 ("bab", "baba")
- i=6: j从8开始,扩展失败,贡献 8-6-2=0
- ...(继续扫描)
总贡献 = 0+1+1+2+2+0+... = 5
复杂度分析
-
时间复杂度:
- 每个字符最多被 指针访问一次
- 每个字符最多被 指针访问一次
-
空间复杂度:
总结
本题的巧妙解法在于:
-
利用循环模式的性质:将复杂的循环匹配条件转化为简单的字符相等比较
-
双指针的单调性: 指针只会向右移动,不会回退,保证线性复杂度
-
简洁的贡献计算:通过 直接计算满足条件的子串数量
-
- 1
信息
- ID
- 5111
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者