題意
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:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
輸出N對括號的所有組合。
解法
比較明顯的深搜,主要保存兩個變量,一個left
用來記錄已經安放的左括號的數量,相當於一個棧,還有一個avaliable
用來記錄剩下還有多少個左括號可以取。當left
不爲空時,對於每一次新括號的選取,可以新增一個左括號(如果avaliable
還沒空的話),或者是取一個右括號來和之前的一個左括號匹配。當left
爲空時,能做的就只有一直取右括號來和前面的左括號匹配。
class Solution
{
public:
vector<string> generateParenthesis(int n)
{
vector<string> ans;
string temp;
dfs(0,n,0,n,ans,temp);
return ans;
}
void dfs(int left,int avaliable,int length,int n,vector<string> & ans,string temp)
{
if(length == n * 2)
{
ans.push_back(temp);
return ;
}
if(left)
{
if(avaliable)
{
temp += '(';
dfs(left + 1,avaliable - 1,length + 1,n,ans,temp);
temp.pop_back();
}
temp += ')';
dfs(left - 1,avaliable,length + 1,n,ans,temp);
temp.pop_back();
}
else
if(avaliable)
{
temp += '(';
dfs(left + 1,avaliable - 1,length + 1,n,ans,temp);
temp.pop_back();
}
}
};