LeetCode 22 题「括号生成」的 Rust 实现,最推荐回溯法(DFS)。核心思路是:在递归构建字符串的过程中,始终保证已放右括号数不超过左括号数。
✅ 方案一:回溯法(DFS)—— 最推荐
这是最直观、高效的方法。Rust 中需注意 String 的所有权,通常用 &mut String 传递并在递归后 pop。
implSolution{pubfngenerate_parenthesis(n:i32)->Vec<String>{letmutresult=Vec::new();letmutcurrent=String::new();Self::backtrack(nasusize,0,0,&mutcurrent,&mutresult);result}fnbacktrack(n:usize,open:usize,close:usize,current:&mutString,result:&mutVec<String>){ifcurrent.len()==2*n{result.push(current.clone());return;}ifopen<n{current.push('(');Self::backtrack(n,open+1,close,current,result);current.pop();}ifclose<open{current.push(')');Self::backtrack(n,open,close+1,current,result);current.pop();}}}🔄 方案二:动态规划(DP)
利用合法括号组合的性质:(A)B,其中 A 和 B 都是合法组合。此方法无需递归,但需要处理 Vec 的所有权。
implSolution{pubfngenerate_parenthesis(n:i32)->Vec<String>{letn=nasusize;letmutdp=vec![vec![String::new()]];// dp[0] = [""]foriin1..=n{letmutcur=Vec::new();forjin0..i{forleftin&dp[j]{forrightin&dp[i-1-j]{cur.push(format!("({}){}",left,right));}}}dp.push(cur);}dp.remove(n)}}📝 方案三:BFS(广度优先搜索)
从 “(” 开始逐层扩展,当左右括号都用完时收集结果。该方法会同时维护多个状态,代码稍显复杂。
⚡ 性能与总结
· 效率:回溯法(DFS)和 DP 都是最优的,时间复杂度为第 n 个卡特兰数 O(4^n / n^(3/2))。
· 选择:回溯法最推荐,因为它最直观、最容易在面试中写出,且能自然地处理 Rust 的所有权问题。
如果对某个方案的细节还有疑问,可以随时再问我。