You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用re模块高效实现连续重复字符的计数压缩?

高效实现连续重复字符的压缩(基于re模块)

需求明确:将字符串中连续重复的相同字符替换为「重复次数+字符」的格式,比如:
输入:

AABBBB$CCCDEEE$AABADEE

输出:

2A4B$3CD3E$2ABAD2E

你原有的循环遍历+多次re.sub的实现,在处理超长字符串时效率极低——每次调用re.sub都会重新扫描整个字符串,多次重复操作会让时间复杂度飙升至O(n²)级别。

基于re模块的高效解决方案

利用正则表达式的单次扫描+回调替换特性,可一次性完成所有转换,时间复杂度直接优化为O(n):

import re

def compress_repeated_chars(input_string):
    # 回调函数:处理每个匹配到的连续重复字符组
    def replace_match(match_obj):
        target_char = match_obj.group(1)
        repeat_count = len(match_obj.group(0))
        # 仅当重复次数>1时替换为「次数+字符」,否则保留原字符
        return f"{repeat_count}{target_char}" if repeat_count > 1 else target_char
    
    # 正则规则:匹配连续重复的单个字符
    # (.) 捕获任意单个字符,\1+ 表示该字符连续出现1次以上
    return re.sub(r'(.)\1+', replace_match, input_string)

# 测试示例
original_str = "AABBBB$CCCDEEE$AABADEE"
compressed_str = compress_repeated_chars(original_str)
print(compressed_str)

原理说明

  1. 正则表达式(.)\1+会精准匹配所有连续重复的字符组(如AA、BBBB、CCC这类);
  2. re.sub仅遍历字符串一次,将每个匹配到的字符组传递给回调函数replace_match;
  3. 回调函数计算字符组长度,返回对应格式的字符串(重复次数为1时直接返回原字符,避免无意义转换);
  4. 全程仅一次字符串扫描,无额外重复遍历操作,超长字符串下的性能表现远优于原实现。

内容的提问来源于stack exchange,提问作者Tawal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:23:11