1.題目
給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 n = 3,生成結果爲:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
2.解題
這道題乍一看和全排列差不多,都是固定好全部的數據修改順序,不過那樣做的話需要判斷所有生成的字符串是否符合要求,感覺並不是很輕鬆,這應該算是笨方法吧。
如果要是往上加字符就輕鬆很多了,因爲有些情況不符合要求就直接被pass了。加字符就和全部子串一樣了。basecase要注意一下,會有些複雜。
思路出來了,但是這是遞歸的,能不能換成動態規劃呢?答案是:我不知道~
我仔細想了一下,二位數組的話,string沒有辦法換成int的那種索引,惟一的辦法就是用hash來代替一個維度的數組,不過我的STL還沒6到那種地步,而且這樣也過了,就先這樣吧。
3.代碼
稍微說一下,n是傳入的,目前有多少組括號。xxx是全部到字符串集合我就沒像以前一樣用傳入實參的方式,感覺那樣看起來就過於複雜了,而且算法題也沒必要那樣。
傳入到三個參數分別代表:左括號的個數,右括號的個數和目前生成的字符串。當然,left+right=x.length(),所以可以減少一個參數,但是我沒有那麼做,感覺那樣寫沒必要。
class Solution {
public:
vector<string>xxx;
int n=0;
void ll(int left, int right, string x)
{
if (left > n || right > n || left < right)
return;
int len = x.length();
if ((n<<1) == len)
{
if (left == right)
{
xxx.push_back(x);
return;
}
else
return;
}
ll(left+1,right,x+'(');
ll(left,right+1,x+')');
}
vector<string> generateParenthesis(int x) {
n = x;
ll(1,0,"(");
return xxx;
}
};