新闻详情

新闻详情

首页 / 资讯中心 / 详情

元宝 LeetCode 131. 分割回文串 Rust实现

发布时间:2026/9/30 11:25:47来源:尧图网络
元宝    LeetCode 131. 分割回文串 Rust实现
Rust 实现 LeetCode 131 的核心逻辑和 Python 完全一致依然是回溯Backtracking。不过在 Rust 里需要稍微注意字符串处理和递归函数的写法。方法一回溯 实时回文判断最直观面试首选ACRust 的“String” 是 UTF-8 编码按索引切片不太方便但本题输入保证是小写英文字母所以可以直接用“as_bytes()” 转成字节切片来处理回文判断用双指针更高效。impl Solution {pub fn partition(s: String) - VecVec {let bytes s.as_bytes();let mut res Vec::new();let mut path Vec::new();backtrack(0, bytes, mut path, mut res);res}}fn backtrack(start: usize,bytes: [u8],path: mut Vec,res: mut VecVec,) {// 切到末尾说明找到了一种合法分割if start bytes.len() {res.push(path.clone()); // 注意必须 clone不能直接移走return;}// 枚举当前起点能切出的所有子串 for end in start..bytes.len() { if is_palindrome(bytes[start..end]) { // 转成 String 加入路径 let sub String::from_utf8(bytes[start..end].to_vec()).unwrap(); path.push(sub); // 做选择 backtrack(end 1, bytes, path, res); // 递归切后面的 path.pop(); // 撤销选择回溯 } }}fn is_palindrome(bytes: [u8]) - bool {let (mut i, mut j) (0, bytes.len().saturating_sub(1));while i j {if bytes[i] ! bytes[j] {return false;}i 1;if j 0 {j - 1;} else {break;}}true}方法二回溯 DP 预处理回文表性能更优如果字符串较长频繁切片判断回文会有开销。可以先 DP 预处理所有子串的回文状态回溯时 O(1) 查询。impl Solution {pub fn partition(s: String) - VecVec {let bytes s.as_bytes();let n bytes.len();// 1. 预处理dp[i][j] 表示 bytes[i..j] 是否为回文 let mut dp vec![vec![false; n]; n]; for i in 0..n { for j in i..n { if bytes[i] bytes[j] (j - i 2 || dp[i 1][j - 1]) { dp[i][j] true; } } } // 2. 回溯 let mut res Vec::new(); let mut path Vec::new(); backtrack(0, bytes, dp, mut path, mut res); res }}fn backtrack(start: usize,bytes: [u8],dp: [Vec],path: mut Vec,res: mut VecVec,) {if start bytes.len() {res.push(path.clone());return;}for end in start..bytes.len() { if dp[start][end] { let sub String::from_utf8(bytes[start..end].to_vec()).unwrap(); path.push(sub); backtrack(end 1, bytes, dp, path, res); path.pop(); } }}Rust 版特有注意事项面试常问要点 说明“path.clone()”“res.push(path)” 会移动所有权导致后续无法回溯必须“clone”和 Python 里“path[:]” 一个道理字符串转换“[u8]” 转“String” 用“String::from_utf8(…).unwrap()”本题输入安全不会 panic递归函数位置 Rust 闭包不能递归调用自己所以写成独立的“fn backtrack”或放在“impl” 里作为辅助方法切片索引“bytes[start…end]” 是闭区间对应“s[start:end1]”Python 风格“saturating_sub” 回文判断里“j bytes.len() - 1” 在空切片时会溢出用“saturating_sub(1)” 更安全虽然本题“n 1”复杂度分析和 Python 版一致时间复杂度最坏“O(2ⁿ · n)”全“‘a’” 字符串每种切法都合法拷贝路径耗时“O(n)”空间复杂度“O(n)” 递归栈深度不计结果存储DP 版额外“O(n²)” 存储回文表跑个示例let s “aab”.to_string();let res Solution::partition(s);// res [[“a”,“a”,“b”], [“aa”,“b”]]要不要我顺便给你写一下 LeetCode 132分割回文串 II 的 Rust DP 实现那题求最少分割次数从回溯直接升级到动态规划是这道题目的经典进阶。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

SVM与SVR的本质区别:损失函数、支持向量与调参实战 2026/9/30 12:00:49

SVM与SVR的本质区别:损失函数、支持向量与调参实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
SRC 挖洞:Apache Tomcat 加密拦截器绕过深度复盘,CVE-2026-34486 fail-open 一行代码怎么打穿集群通信 2026/9/30 12:00:49

SRC 挖洞:Apache Tomcat 加密拦截器绕过深度复盘,CVE-2026-34486 fail-open 一行代码怎么打穿集群通信

作者 akihi(白帽攻防录讲师),某甲方网络安全工程师,合合 SRC 年度第一、腾讯 SRC 连续三年前十,单漏洞赏金 4w,擅长 Web/App/PC 客户端漏洞挖掘。专注中间件安全、反序列化漏洞、代码审计。本文基于公开 CV…

阅读更多 →
架构演进路径:从单机分库到微服务容器编排实战指南 2026/9/30 12:00:42

架构演进路径:从单机分库到微服务容器编排实战指南

读写分离、垂直分库、微服务、容器编排——这些词单独拿出来都能讲半小时,但真正让人头疼的是把它们串成一条演进路径时,每一步该怎么做、为什么要这么做。我经历过一个项目从单机部署一路走到容器编排的完整过程,途中踩了不少坑,…

阅读更多 →
TyHGB复合指标:基于CHARLS的胰岛素抵抗新标志物构建与验证 2026/9/30 12:00:42

TyHGB复合指标:基于CHARLS的胰岛素抵抗新标志物构建与验证

最近在CHARLS数据里折腾胰岛素抵抗相关指标的时候,我顺手去医院统计了一下PubMed上TyG类复合指标的发文量。坦白说,TyG-BMI、TyG-WC、TyG-WHtR这类组合已经被很多人做过了,CHARLS数据库上的相关论文一年比一年多,肉眼可见地卷起来…

阅读更多 →
Vue3 从入门到熟练:响应式、组件通信与工程化避坑指南 2026/9/30 12:00:42

Vue3 从入门到熟练:响应式、组件通信与工程化避坑指南

三年前我第一次把线上项目从 Vue2 迁到 Vue3, setup 里满屏的 ref 和 .value 让我一度怀疑这是不是同一个框架。后来陆续带过几个刚入行的同学,发现大家卡住的位置出奇地一致:不是语法写不出来,而是脑子里还留着 Vue2 那套 …

阅读更多 →
部门考核待处理模块全解析:流程逻辑、操作场景与清待技巧 2026/9/30 12:00:42

部门考核待处理模块全解析:流程逻辑、操作场景与清待技巧

部门考核页面上挂了几十条待办,点进去不知道先处理哪条;考核周期结束了,系统里还有一堆“待处理”没人管;明明已经评分了,流程却卡在“待处理”里不动。如果你也在被这些问题折腾,那这篇内容就是写给你的。…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉