如何用Python实现固定块长k的类正则式游程编码?
基于分块长度k的字符串游程编码实现
需求说明
将字符串按长度为k的块进行游程编码,生成类正则式的摘要:连续重复的块以(块内容)重复次数的格式表示,非重复块或剩余不足k长度的部分直接保留。
示例
输入字符串:
TATTTTATTTTATTTTATGTTATGTTATGTTATGTTATGTTATGTTATGTTATGTTATGTTACATTATTTTA
分块长度k=5
输出结果:(TATTT)3(TATGT)9TACATTATTTTA
Python代码实现
def run_length_encode(s, k): if k <= 0: raise ValueError("分块长度k必须大于0") if not s: return "" result = [] total_length = len(s) current_idx = 0 while current_idx <= total_length - k: current_block = s[current_idx:current_idx + k] repeat_count = 1 # 统计连续重复的同一块 while (current_idx + k <= total_length - k) and (s[current_idx + k:current_idx + 2*k] == current_block): repeat_count += 1 current_idx += k # 按规则添加到结果 if repeat_count > 1: result.append(f"({current_block}){repeat_count}") else: result.append(current_block) current_idx += k # 处理末尾不足k长度的剩余字符 if current_idx < total_length: result.append(s[current_idx:]) return ''.join(result) # 测试示例 test_str = "TATTTTATTTTATTTTATGTTATGTTATGTTATGTTATGTTATGTTATGTTATGTTATGTTACATTATTTTA" k_value = 5 print(run_length_encode(test_str, k_value))
代码逻辑说明
- 合法性校验:先判断
k是否大于0,空字符串直接返回空结果 - 遍历分块:从字符串起始位置开始,每次截取长度为
k的块,统计连续重复的次数 - 结果构建:重复次数大于1时使用压缩格式,否则直接保留块内容
- 剩余处理:字符串末尾不足
k长度的部分直接追加到结果中
内容的提问来源于stack exchange,提问作者Wouter De Coster
相关产品推荐
相关产品推荐

