括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。
说明:解集不能包含重复的子集。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
题目比较简单,代码如下。
public class Solution {
public IList<string> GenerateParenthesis(int n) {
IList<string> ans = new List<string>();
Partition(ans, new StringBuilder(), 0, 0, n);
return ans;
}
public void Partition(IList<string> ans, StringBuilder sb, int i, int j, int n) {
if (i == n && j == n) { // 递归出口
ans.Add(sb.ToString());
return;
}
if (i == n) { // 左括号添加完,只能添加右括号
sb.Append(')');
Partition(ans, sb, i, j + 1, n);
sb.Remove(sb.Length - 1, 1); // 回溯
}
else { // 左、右括号都可以继续添加
// 先添加左括号
sb.Append('(');
Partition(ans, sb, i + 1, j, n);
sb.Remove(sb.Length - 1, 1); // 回溯
// 如果可以添加右括号,则添加
if (i > j) {
sb.Append(')');
Partition(ans, sb, i, j + 1, n);
sb.Remove(sb.Length - 1, 1); // 回溯
}
}
}
}