您的位置首页 >人工智能 >

Rust 实现 LeetCode443 压缩字符串,完整算法题解

LeetCode443 压缩字符串这道原地数组压缩题目,用 Rust 语言实现核心思路是双指针,不开额外大空间,直接在原字符数组上修改,返回压缩之后的新长度,适合练习原地修改数组、计数遍历这类基础算法。题目要求只能在输入的 & mut Vec原地操作,不能新建容器存放全部结果,很多新手容易踩坑,直接 push 新字符导致空间超限,或者数字大于 9 的时候没有拆分多位数字,最后结果出错。本题逻辑是用 read 指针读取原数组字符,write 指针记录写入位置,统计连续相同字符的数量;遇到字符变化,就把当前字符写入 write 位置,数量大于 1 时,把数字拆成单个字符依次写入,最后返回 write 指针的值就是压缩后的长度。Rust 版本需要注意可变 vector 借用、数字转字符、多位数字拆解处理,下面附带完整可运行代码、步骤拆解和边界案例。

LeetCode443 题目简述

给定字符数组 chars,使用原地算法压缩:

  1. 连续相同字符,写成「字符 + 重复次数」,次数为 1 只保留字符,不写数字
  2. 数字大于 9,必须拆成多位字符,例如 12 写成 '1','2'
  3. 在原数组修改,返回压缩后的数组长度

示例:

输入:["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

}

算法执行步骤清单

  1. 初始化两个指针 read(读取位置)、write(写入位置),初始值都是 0
  2. read 指针向后遍历,统计当前连续相同字符的个数 count
  3. 把当前字符写入 chars [write],write 自增
  4. 如果 count 大于 1,将 count 转为字符串,逐个字符写入数组,write 依次后移
  5. 循环直到 read 遍历完整个数组
  6. 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 时需匹配平台函数签名;算法性能会随输入数据规模波动,题解思路仅供学习参考,不保证适配所有工程业务场景。

今日大家都在搜的词: