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

如何高效实现连续重复字符的字符串压缩?

字符串压缩的高效实现方案

嘿,你提到的用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:21:17