1. 双指针算法基础与压缩字符串场景
双指针算法是处理数组和字符串问题的经典技巧,特别适合需要原地修改数据的场景。所谓双指针,就是在遍历过程中使用两个指针(通常称为快指针和慢指针)协同工作,快指针负责扫描数据,慢指针负责构建结果。这种模式的时间复杂度通常是O(n),空间复杂度O(1),在字符串压缩这类问题上展现出独特优势。
字符串压缩的典型场景是:给定一个字符数组chars,需要原地压缩并返回压缩后的新长度。压缩规则是将连续重复字符替换为字符+重复次数,如果重复次数为1则不显示数字。例如输入["a","a","b","b","c","c","c"]应压缩为["a","2","b","2","c","3"],返回长度6。
注意:真正的难点在于原地修改数组,这意味着不能使用额外空间存储结果,必须在原数组上直接操作。这正是双指针大显身手的地方。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 压缩字符串的完整实现步骤
2.1 初始化指针与变量
我们首先初始化两个指针:
- write_ptr(慢指针):记录当前写入位置,初始为0
- read_ptr(快指针):遍历原始数组,初始为0
同时需要current_char记录当前处理的字符,count记录连续出现次数。
python复制def compress(chars):
write_ptr = 0
read_ptr = 0
n = len(chars)
2.2 主循环逻辑实现
快指针read_ptr从左到右扫描数组,当字符变化或到达末尾时,执行压缩写入:
python复制while read_ptr < n:
current_char = chars[read_ptr]
count = 0
# 统计相同字符数量
while read_ptr < n and chars[read_ptr] == current_char:
read_ptr += 1
count += 1
# 写入字符
chars[write_ptr] = current_char
write_ptr += 1
# 写入计数(如果>1)
if count > 1:
