如何高效实现连续重复字符的字符串压缩?
字符串压缩的高效实现方案
嘿,你提到的用if语句实现字符串压缩的方式确实存在效率和逻辑上的小问题——比如你代码里的第二个循环因为初始message_comp长度为1,根本不会执行,而且用try-except处理最后一个字符的越界也不够优雅。下面给你两种更优的实现思路,轻松解决连续重复字符的压缩需求:
一、正则表达式实现(最简洁的方案)
Python的re模块可以完美匹配连续重复的字符,配合re.sub()和回调函数就能一行核心逻辑搞定:
import re def comp(string): def replace_block(match): # 获取匹配到的连续字符块的第一个字符和长度 char = match.group(0)[0] count = len(match.group(0)) return f"{char}{count}" # 正则匹配:(.)捕获单个字符,\1*匹配该字符的连续重复 return re.sub(r'(.)\1*', replace_block, string)
测试一下效果:
print(comp("aaabbbccc")) # 输出: a3b3c3 print(comp("aaabbbcccaaa")) # 输出: a3b3c3a3
这个方案的优势是代码简洁,正则引擎的匹配效率经过优化,处理长字符串也很高效。
二、优化的迭代实现(无需正则,性能拉满)
如果不想依赖正则,也可以优化迭代逻辑,只遍历字符串一次就能完成压缩,时间复杂度是O(n),比你原来的实现高效很多:
def comp(string): # 先处理空字符串的边界情况 if not string: return "" result = [] current_char = string[0] count = 1 # 从第二个字符开始遍历 for char in string[1:]: if char == current_char: count += 1 else: # 把上一组的结果加入列表 result.append(f"{current_char}{count}") current_char = char count = 1 # 别忘了处理最后一组字符 result.append(f"{current_char}{count}") return ''.join(result)
这个写法逻辑清晰,不需要额外存储索引,直接跟踪当前字符和重复次数,避免了不必要的内存开销。
顺便说下你现有代码的小问题
- 第二个循环
for i in range(1, len(message_comp)):因为message_comp初始只有一个元素,这个循环根本不会执行,所以最后只会返回第一个片段的结果 - 用
string[i] is not string[i+1]判断字符相等:应该用!=而不是is not,is判断的是对象身份,虽然字符场景下大多没问题,但不是正确的比较方式 - 裸
except:没有指定具体异常类型,容易隐藏其他意想不到的错误
内容的提问来源于stack exchange,提问作者Beverlie
相关产品推荐
相关产品推荐

