Java双指针字符串压缩与去重核心是用left和right标记字符段起始与扫描位,压缩如"aaabbc"→"a3b2c1",去重如"aaabcccd"→"abcd";需用StringBuilder避免O(n²)拼接,注意right边界检查与left及时更新。

Java 中用 while 循环实现双指针字符串压缩与去重,核心在于用两个下标(left 和 right)分别标记当前字符段的起始与扫描位置,边遍历边构造结果,无需额外集合去重,也避免了频繁字符串拼接带来的性能损耗。
字符串压缩:统计连续相同字符
压缩逻辑是将 "aaabbc" 变成 "a3b2c1"。用 left 固定每段首字符位置,right 向后滑动统计相同字符个数:
- 初始化
left = 0,right = 0,用StringBuilder累积结果 - while 循环中,内层 while 让 right 持续右移,直到
s.charAt(right) != s.charAt(left) - 外层每次处理完一段,追加字符 + 长度:
sb.append(s.charAt(left)).append(right - left) - 更新
left = right,继续下一段
字符串去重(相邻重复字符只保留一个)
去重指去除连续重复,如 "aaabcccd" → "abcd"。仍用双指针,但只需保留每个连续段的首个字符:
- left 指向待保留字符位置,right 负责探索
- 外层 while 控制 right
- 每次内层退出时,说明遇到新字符或结尾,立即 append 当前 s.charAt(left),再令
left = right - 注意边界:循环结束后需补上最后一段字符(若 right 已越界,left 仍有效)
压缩 + 去重合并处理(按需选择)
若需求是“先去重再压缩”或“压缩后过滤长度为1的项”,不建议串行两次双指针。可在一次扫描中融合逻辑:
立即学习“Java免费学习笔记(深入)”;
- 维持 left 和 right,每次找到一段后,计算长度 len = right - left
- 若仅去重:len > 0 时只记一次字符
- 若压缩且跳过单字符:仅当 len > 1 时 append 字符+数字;len == 1 时可跳过或只记字符(依需求定)
- 用 char[] 或 StringBuilder 构建结果,避免 String += 的 O(n²) 开销
关键细节与避坑提示
实际编码时容易忽略边界和状态更新:
- while 条件必须检查
right ,否则越界异常 - 内层 while 终止后,
right指向第一个不同字符,所以长度是right - left,不是right - left + 1 - 外层循环不能直接写
while (right 就结束——末尾一段需在循环外显式处理,或把 right 初始化为 1、left 为 0,并在循环内统一处理 - 空字符串或单字符输入要提前返回,避免索引异常


















