https://leetcode.com/problems/generate-parentheses/?tab=Description
这道题虽然最后的代码简单,但是想到怎么做却并不容易。后来也是看了discuss才会做...递归的思路是分别跟踪当前剩余的左括号和右括号数量,然后分出两支:
- 加一个左括号,并往下递归;
- 如果剩余右括号数多于剩余左括号数,则加右括号,并往下递归;否则什么也不做
注意在分支2中,“剩余右括号数多于剩余左括号数”这个条件很重要,有了这个条件的约束,可以避免不合法的括号组合,比如n=2,")()("就是不合法的组合。
/*
* author : TK
* date : 2017-02-15
* problem: LeetCode 22. Generate Parentheses
* method : Depth-First-Search
* lang : C++
*/
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ret;
string str = "";
dfs(ret, str, n, n);
return ret;
}
void dfs(vector<string>& ret, string str, int left_remain, int right_remain) {
if (left_remain == 0 && right_remain == 0) {
ret.push_back(str);
return;
}
if (left_remain > 0) dfs(ret, str + "(", left_remain - 1, right_remain);
if (right_remain > left_remain) dfs(ret, str + ")", left_remain, right_remain - 1);
}
};