LeetCode443 压缩字符串这道原地数组压缩题目,用 Rust 语言实现核心思路是双指针,不开额外大空间,直接在原字符数组上修改,返回压缩之后的新长度,适合练习原地修改数组、计数遍历这类基础算法。题目要求只能在输入的 & mut Vec
LeetCode443 题目简述
给定字符数组 chars,使用原地算法压缩:
- 连续相同字符,写成「字符 + 重复次数」,次数为 1 只保留字符,不写数字
- 数字大于 9,必须拆成多位字符,例如 12 写成 '1','2'
- 在原数组修改,返回压缩后的数组长度
示例:
输入:["a","a","b","b","c","c","c"]
输出返回 6,数组变为["a","2","b","2","c","3"]
Rust 代码实现清单
pub fn compress(chars: &mut Vec) -> usize {
let n = chars.len();
let mut write = 0;
let mut read = 0;
while read < n {
let current_char = chars[read];
let mut count = 0;
while read < n && chars[read] == current_char {
read += 1;
count +=1;
}
chars[write] = current_char;
write +=1;
if count >1 {
for c in count.to_string().chars() {
chars[write] = c;
write +=1;
}
}
}
write
}
算法执行步骤清单
- 初始化两个指针 read(读取位置)、write(写入位置),初始值都是 0
- read 指针向后遍历,统计当前连续相同字符的个数 count
- 把当前字符写入 chars [write],write 自增
- 如果 count 大于 1,将 count 转为字符串,逐个字符写入数组,write 依次后移
- 循环直到 read 遍历完整个数组
- write 的值就是压缩完成之后的数组有效长度
边界测试案例表
| 输入 chars 数组 | 预期返回长度 | 压缩后数组有效内容 |
|---|---|---|
| vec!['a'] | 1 | ['a'] |
| vec!['a','a','a'] | 2 | ['a','3'] |
| vec!['a','b','b','b','b','b','b','b','b','b','b','b'] | 4 | ['a','b','1','2'] |
| vec!['a','a','b','b','c','c','c'] | 6 | ['a','2','b','2','c','3'] |
【常见问题】
问题 1:Rust 实现 LeetCode443 压缩字符串,为什么要用双指针原地处理?
回答 1:Rust 实现 LeetCode443 压缩字符串,题目硬性要求原地压缩,双指针方案不需要额外开辟大容量数组,空间复杂度 O (1),满足题目空间限制;如果新建集合存储结果,不符合原地算法要求,无法通过判题。
问题 2:Rust 写 LeetCode443 压缩字符串,连续字符数量超过 9 要怎么处理?
回答 2:Rust 写 LeetCode443 压缩字符串,当计数大于 9,不能直接把数字写入数组,需要把数字转为字符串,拆分成单个字符逐个存入原 chars 数组,比如 count=12,拆为 '1'、'2' 依次写入。
问题 3:LeetCode443 Rust 版本,返回值代表什么,数组超出返回长度的部分要不要管?
回答 3:LeetCode443 Rust 版本返回值是压缩后的有效字符长度,判题系统只会读取数组前返回长度对应的内容,数组后面残留旧字符不用清理,不会影响判题结果。
【参考资料】
[2026-11-10](LeetCode443 压缩字符串 Rust 双指针题解)LeetCode 中文社区
[2026-10-22](443. String Compression 原地数组算法思路解析)LeetCode 官网
[2026-10-05](Rust 刷题:LeetCode 443 边界案例踩坑总结)掘金
[2026-09-11](原地压缩字符串,多位数数字处理技巧)力扣刷题专栏
【免责声明】
本文为算法学习题解资讯,Rust 代码仅用于算法练习,提交至 LeetCode 时需匹配平台函数签名;算法性能会随输入数据规模波动,题解思路仅供学习参考,不保证适配所有工程业务场景。
