今天,我們來看一下LeetCode的第22道題:括號生成
題目描述
給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 n = 3,生成結果爲:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路:
首先,我們要明確題目的要求,給出n對括號,生成這n對括號的所有排列組合,要求是每一個‘(’和‘)’都要一一對應起來。
我們可以使用遞歸來實現。怎麼遞歸呢?首先定義一個string的對象s,將全部的‘(’添加到s中,然後依次給s添加‘)’,添加了多少個‘(’就要添加多少個‘)’,因爲他們要一一對應起來。當全部添加結束後就將該對象放入vector中,這裏因爲C++引用與非引用在遞歸中的特點,每次減少一個‘(’,然後在添加‘)’,逐步的添加‘(’和‘)’。如下爲前兩次所示。
每一行代表給s中尾插了一個字符。
//第一次
1、“(”
2、“((”
3、“(((”
4、“((()”
5、“((())”
6、“((()))”//到這裏結束,可以將該字符串放入vector中
//第二次
1、“(”
2、“((”
3、“((”
4、“(()(”
5、“(()()”
6、“(()())”//到這裏結束,可以將該字符串放入vector中
//其中第二次的1、2、3步和第一次的1、2、3步是一樣,只不過是返回了上層函數,字符串沒有用引用的原因,字符串又變回去了。
代碼
//res:題目給出的函數將要返回的vector的對象。
//s:該s就是上述思路中所一直在提到的s,存放“(”和“)”的排列組合的字符串。
//left:表示‘(’已經出現的個數。
//right:表示‘)’已經出現的個數。
//n:題目給出的n
void _generateParenthesis(vector<string>& res, string s, int left, int right, int n)
{
if(right== n)
{
res.push_back(s);
return;
}
if(left< n)
_generateParenthesis(res, s + "(", left+ 1, right, n);
if(left> right)
_generateParenthesis(res, s + ")", left, right+ 1, n);
}
vector<string> generateParenthesis(int n) {
vector<string> res;
_generateParenthesis(res, "", 0, 0, n);
return res;
}