如何利用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+会精准匹配所有连续重复的字符组(如AA、BBBB、CCC这类); re.sub仅遍历字符串一次,将每个匹配到的字符组传递给回调函数replace_match;- 回调函数计算字符组长度,返回对应格式的字符串(重复次数为1时直接返回原字符,避免无意义转换);
- 全程仅一次字符串扫描,无额外重复遍历操作,超长字符串下的性能表现远优于原实现。
内容的提问来源于stack exchange,提问作者Tawal
相关产品推荐
相关产品推荐

