1、题目描述
输入整数n,返回由n对()组成的合法的括号排列。
2、思路
Backtracking。
Implement an function called dfs.
One argument passes to this function is a string named s, which is "(".
Another argument named cnt, which refers to the number of "(" in the string s.
There are two possible character adding to the rear of s, "(" and ")".
When we attach "(" to the string, the next step is calling dfs(s,cnt+1).
Otherwise, call dfs(s,cnt-1).
When the length of s is equal to the double of n, and cnt = 0, add s to the answer set.
3、代码
vector<string> generateParenthesis(int n) {
vector<string> ans;
if(n==0){
ans.push_back("");
return ans;
}
string s="(";
dfs(ans,s,1,n);
return ans;
}
void dfs(vector<string>& ans,string& s,int cnt,int n){
if(s.size()==n*2){
if(cnt==0)
ans.push_back(s);
return;
}
string org = s;
s=s+"(";
dfs(ans,s,cnt+1,n);
s=org;
s=s+")";
if(cnt>=1)
dfs(ans,s,cnt-1,n);
}
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ans;
string s;
dfs(ans,s,0,n);
return ans;
}
void dfs(vector<string>& ans,string& s,int cnt,int n){
if(s.size()==n*2) {
if(cnt==0)
ans.push_back(s);
return;
}
if(cnt < 0)
return;
string org = s;
s=s+"(";
dfs(ans,s,cnt+1,n);
s=org+")";
dfs(ans,s,cnt-1,n);
}
};