题目: Generate Parentheses
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
"((()))", "(()())", "(())()", "()(())", "()()()"
分析:这道题不难,只要分析对了,一切迎刃而解。怪只怪我思维定势太严重,总认为括号是成对出现的,于是写出了这样的代码:
private void generate(String prefix, String suffix, ArrayList<String> strings, int n) {
if (n == 1) {
strings.add(prefix + "()" + suffix);
return;
}
generate(prefix + "(", ")" + suffix, strings, n - 1);
generate(prefix + "()", suffix, strings, n - 1);
if (suffix.length() > 0) {
generate(prefix + "()" + suffix, "", strings, n - 1);
}
}
当n = 4时,上述代码是生成不出((())())
这种效果的,具体的不分析了。
正确的思考方式是采用DFS。
- 如果左括号还能括就不断的画左括号,直到左括号的数量等于n。
- 接下来考虑右括号,因为对于一对括号,右括号不能出现在左括号前,所以当右括号数量小于左括号时,加上右括号。
- 当左右括号数量都等于n时,得到解。
这种策略可以保证每一步都是一个全新的解,甩出上一种解法好几条街。
代码:
public class Solution {
public ArrayList<String> generateParenthesis(int n) {
ArrayList<String> strings = new ArrayList<String>();
if (n == 0) return strings;
dfs(0, 0, "", strings, n);
return strings;
}
private void dfs(int left, int right, String buffer, ArrayList<String> strings, int n) {
if (left == n && right == n) {
strings.add(buffer);
return;
}
if (left < n) {
dfs(left + 1, right, buffer + "(", strings, n);
}
if (left > right) {
dfs(left, right + 1, buffer + ")", strings, n);
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。