Skip to content

Commit 2d6edf6

Browse files
committed
feat: resolved
1 parent 43353b2 commit 2d6edf6

File tree

1 file changed

+22
-12
lines changed
  • generate_parentheses/src

1 file changed

+22
-12
lines changed

generate_parentheses/src/lib.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
1+
/*!
2+
* Follow solution: https://leetcode.com/problems/generate-parentheses/discuss/10100/Easy-to-understand-Java-backtracking-solution
3+
*/
4+
15
pub struct Solution {}
26

37
impl Solution {
48
pub fn generate_parenthesis(n: i32) -> Vec<String> {
5-
if n == 1 {
6-
return vec!["()".to_string()];
9+
let mut list = Vec::new();
10+
Self::backtrack(&mut list, "".to_string(), 0, 0, n as usize);
11+
list
12+
}
13+
14+
fn backtrack(list: &mut Vec<String>, s: String, open: usize, close: usize, max: usize) {
15+
// 如果前缀为 s 的值,获取所有可能性,加入 list
16+
if (s.chars().count()) == max * 2 {
17+
list.push(s);
18+
return;
19+
}
20+
21+
if open < max {
22+
// 如果前缀中的 `(` 数量达到最大值,不再往前缀中加入 `(`
23+
Self::backtrack(list, s.clone() + "(", open + 1, close, max);
724
}
8-
let mut result = Vec::new();
9-
for r in Self::generate_parenthesis(n - 1) {
10-
result.push(format!("({})", r));
11-
let s1 = format!("(){}", r);
12-
let s2 = format!("{}()", r);
13-
if s2 != s1 {
14-
result.push(s2);
15-
}
16-
result.push(s1);
25+
if close < open {
26+
// 如果前缀中的 `)` 数量和 `(` 数量一样多了,不再往前缀中加入 `)`
27+
Self::backtrack(list, s.clone() + ")", open, close + 1, max);
1728
}
18-
result
1929
}
2030
}
2131

0 commit comments

Comments
 (0)