
该教程介绍如何高效统计字符串中连续相同字符构成的“三连重复组”数量(如 '111'、'aaa' 算作1组),而非简单滑动窗口式重叠计数,避免将 '1111' 错误计为2次。
该教程介绍如何高效统计字符串中连续相同字符构成的“三连重复组”数量(如 `'111'`、`'aaa'` 算作1组),而非简单滑动窗口式重叠计数,避免将 `'1111'` 错误计为2次。
在处理字符串重复模式时,一个常见误区是使用固定长度滑动窗口(如检查 s[i] == s[i+1] == s[i+2])来累计三连重复——这种方法会将 '1111'(4个连续 '1')识别为两次重叠匹配(位置0–2和1–3),返回 2,但实际业务中通常期望将其视为 1组完整三连 + 1个冗余字符,即仅计 1 组;而 '111111'(6个 '1')应计为 2 组(111 + 111)。因此,正确逻辑应基于连续相同字符段的长度整除3。
以下是推荐实现:
def count_repeat(s: str) -> int:
if not s:
return 0
num = 0
cur_rep = 1 # 当前连续相同字符的长度,起始为1(首字符自身)
for i in range(1, len(s)):
if s[i] == s[i - 1]:
cur_rep += 1
else:
num += cur_rep // 3 # 当前段结束,累加可构成的完整三连组数
cur_rep = 1 # 重置计数器,开始新字符段
num += cur_rep // 3 # 处理末尾未触发else分支的最后一段
return num
✅ 示例验证:
- '111111aaaa' → '111111'(6个'1' → 6//3 = 2) + 'aaaa'(4个'a' → 4//3 = 1) = 3
- '1111' → 4//3 = 1
- '11111' → 5//3 = 1
- '111222333' → 每段3个 → 1+1+1 = 3
⚠️ 注意事项:
- 避免使用 str 作为参数名(已改为 s),防止覆盖内置类型 str,引发隐式类型错误或IDE警告;
- 空字符串或单/双字符输入会安全返回 0(因 cur_rep // 3 对 1 或 2 结果为 0);
- 如需支持任意长度重复(如四连、五连),只需将代码中所有 3 替换为目标数值,并确保除法使用 //(整除);
- 时间复杂度为 O(n),空间复杂度 O(1),适用于长文本高效扫描。
此方法本质是按“同质连续段”分组再聚合,语义清晰、无重叠歧义,是处理此类重复计数问题的稳健范式。










