java压缩字符串中连续重复字符的常用方法是遍历统计相邻相同字符个数并用stringbuilder拼接“字符+次数”,避免string+=导致o(n²)性能退化,需处理空串、单字符等边界情况。

Java 中压缩字符串中连续重复字符,常用方法是遍历字符串,统计相邻相同字符的个数,然后拼接“字符+次数”。核心在于避免频繁字符串拼接,推荐用 StringBuilder 提升性能。
基础实现:遍历计数 + StringBuilder
适用于一般场景,逻辑清晰,易于理解:
- 从索引 0 开始遍历,用变量记录当前字符和连续出现次数
- 遇到不同字符或到达末尾时,将“当前字符+次数”追加到
StringBuilder - 注意处理空字符串和单字符边界情况
public static String compress(String s) {
if (s == null || s.length() == 0) return s;
StringBuilder sb = new StringBuilder();
char cur = s.charAt(0);
int count = 1;
for (int i = 1; i
<p>输入 <code>"aaabbbcccd"</code> → 输出 <code>"a3b3c3d1"</code></p>
<h3>进阶优化:只压缩长度 ≥2 的重复(可选)</h3>
<p>若希望仅对重复≥2次的字符压缩(如 <code>"abc"</code> 不变,<code>"aabb"</code> → <code>"a2b2"</code>),只需在拼接前加判断:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review"><img
src="https://img.php.cn/upload/skill/000/000/081/179084711841712.jpg" alt="Java Maven Code Review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="overflowclass">Java Maven Code Review</a>
<p class="overflowclass">审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
if (count > 1) sb.append(cur).append(count);- 否则直接
sb.append(cur)(即不压缩单个字符)
这样输出更紧凑,适合实际文本压缩需求。
注意事项与常见坑
- 不要用
String +=拼接——每次都会新建对象,时间复杂度退化为 O(n²) - 数字部分需转为字符串,但
append(int)在StringBuilder中已自动处理 - 若原始字符串极长,可预估
StringBuilder容量(如new StringBuilder(s.length())),减少扩容开销 - 该算法只处理「连续」重复,不处理全局去重(如
"abab"中的 a 不会被合并)
一行流写法(仅作参考,不建议生产使用)
借助 Java 8 Stream 可实现函数式风格,但可读性差、性能低、不易调试:
- 需先按连续分组(较麻烦,通常要借助第三方库或自定义 collector)
- 实际项目中优先选清晰、可维护的遍历方案
不复杂但容易忽略细节,掌握遍历+计数+StringBuilder 这一模式,就能稳稳应对多数字符串压缩需求。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










