Python实现字符串压缩
任务要求
给定一个只包含大小写英文字母的字符串,将字符串压缩后输出。
压缩规则如下:
如果一个字符重复出现多次,则将其表示为“字符+重复次数”。如果一个字符仅出现一次,则只保留该字符。
例如,字符串aabcccccaaa会变为a2bc5a3。
任务分析
字符串压缩的核心思想是通过记录每个字符的重复次数来减少字符串的长度。例如,字符串aabcccccaaa可以被压缩为a2bc5a3。具体规则如下:
1.重复字符的处理:当一个字符重复出现时,将其表示为“字符+重复次数”。例如,aa压缩为a2,aaaa压缩为a4。
2.单字符的处理:如果一个字符仅出现一次,则直接保留该字符。例如,abc压缩为abc。
3.特殊情况的处理:
空字符串返回空字符串。单字符字符串直接返回该字符。
任务实现
方法一:基本循环遍历。通过遍历字符串,逐个比较相邻字符,记录每个字符的重复次数。
def compress_string(s): if not s: return "" result = [] current_char = s[0] count = 1 for char in s[1:]: if char == current_char: count += 1 else: result.append(current_char) if count > 1: result.append(str(count)) current_char = char count = 1 # 处理最后一个字符 result.append(current_char) if count > 1: result.append(str(count)) return "".join(result)# 示例 input_str = "aabcccccaaa"output_str = compress_string(input_str)print(f"输入字符串: {input_str}")print(f"压缩后的字符串: {output_str}")
运行结果:
输入字符串: aabcccccaaa
压缩后的字符串: a2bc5a3
进程已结束,退出代码为 0
初始检查,如果输入字符串为空,直接返回空字符串。从第一个字符开始,逐个比较相邻字符。记录重复次数,当字符与前一个字符相同时,增加计数器;当字符与前一个字符不同时,将前一个字符及其重复次数(如果大于1)添加到结果中。遍历结束后,处理最后一个字符及其重复次数。将结果列表拼接为字符串并返回。
方法二:使用正则表达式。通过正则表达式匹配连续重复的字符,然后进行压缩。
import redef compress_string_regex(s): if not s: return "" # 匹配连续相同的字符 pattern = r"(\w)\1*" matches = re.finditer(pattern, s) result = [] for match in matches: char = match.group(1) length = len(match.group()) result.append(char) if length > 1: result.append(str(length)) return "".join(result)# 示例input_str = "aabcccccaaa"output_str = compress_string_regex(input_str)print(f"输入字符串: {input_str}")print(f"压缩后的字符串: {output_str}")
运行结果:
输入字符串: aabcccccaaa
压缩后的字符串: a2bc5a3
进程已结束,退出代码为 0
使用正则表达式r"(\w)\1*"匹配连续相同的字符。\w匹配字母,\1*表示匹配前一个字符的零次或多次。对每个匹配项,提取字符及其重复次数,然后,将字符及其重复次数(如果大于1)添加到结果列表中,最后,将结果列表拼接为字符串并返回。
方法三:使用列表推导式。通过列表推导式和循环遍历结合,实现更简洁的代码。
def compress_string_list_comprehension(s): if not s: return "" compressed = [] prev_char = s[0] count = 1 for char in s[1:]: if char == prev_char: count += 1 else: compressed.append(prev_char) if count > 1: compressed.append(str(count)) prev_char = char count = 1 # 处理最后一个字符 compressed.append(prev_char) if count > 1: compressed.append(str(count)) return "".join(compressed)# 示例input_str = "aabcccccaaa"output_str = compress_string_list_comprehension(input_str)print(f"输入字符串: {input_str}")print(f"压缩后的字符串: {output_str}")
运行结果:
输入字符串: aabcccccaaa
压缩后的字符串: a2bc5a3
进程已结束,退出代码为 0
从第一个字符开始,逐个比较相邻字符。当字符与前一个字符相同时,增加计数器;当字符与前一个字符不同时,将前一个字符及其重复次数(如果大于1)添加到结果中。遍历结束后,处理最后一个字符及其重复次数。将结果列表拼接为字符串并返回。
方法四:使用递归。通过递归的方式逐步压缩字符串。
def compress_string_recursive(s, index=0, result=[], current_char=None, count=0): if not s: return "" if index == 0: current_char = s[index] count = 1 return compress_string_recursive(s, index + 1, result, current_char, count) if index < len(s): char = s[index] if char == current_char: count += 1 else: result.append(current_char) if count > 1: result.append(str(count)) current_char = char count = 1 return compress_string_recursive(s, index + 1, result, current_char, count) else: result.append(current_char) if count > 1: result.append(str(count)) return "".join(result)# 示例input_str = "aabcccccaaa"output_str = compress_string_recursive(input_str)print(f"输入字符串: {input_str}")print(f"压缩后的字符串: {output_str}")
运行结果:
输入字符串: aabcccccaaa
压缩后的字符串: a2bc5a3
进程已结束,退出代码为 0
如果index为0,初始化当前字符和计数器。逐个比较字符,记录重复次数。当遍历结束后,处理最后一个字符及其重复次数。将结果列表拼接为字符串并返回。
总结
通过以上四种方法,可以实现字符串的压缩功能。每种方法都有其特点和适用场景:
1.基本循环遍历:直观且易于理解,适用于大多数场景。
2.正则表达式:简洁高效,适用于复杂的模式匹配。
3.列表推导式:代码简洁,适用于需要快速实现的场景。
4.递归:代码结构清晰,适用于需要递归处理的场景。
