(22)Generate Parentheses
題目:寫出所有n對“(”,“)”能組合成的符合正常規則的字符串。
例如:當n=“3”的時候,答案集爲:
[
"((()))"
"(()())"
"(())()"
"()(())"
"()()()"
]
第一個想法就是直接DFS,很簡單的搜一遍就完事了,把所有的可能放入vector裏。當然符合規則是最重要的問題,不妨考慮括號的使用情況。
對於n對括號,首先如果字符串內右括弧數量大於左括弧,那麼肯定是不對的;如果左邊的括號多於右邊的括號時,可以放入左括號也可以放入右括號;如果n對括號都用完了也就結束了,可以把字符串放入vector。
但是對於使用數量來說,更容易計算的是剩餘數量,所以代碼裏使用的lef和rig是剩餘的左括號和右括號的數量。
下面是代碼:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> s ;
generateVector(n,n,"",s);
return s;
}
void generateVector(int lef, int rig, string str, vector<string> &s){
if(lef > rig){
return;
}
if(lef == 0 && rig == 0){
return s.push_back(str);
}
else{
if(lef > 0){
string s1 = str;
s1 += "(";
generateVector(lef-1, rig, s1, s);
}
if(rig > 0){
string s1 = str;
s1 += ")";
generateVector(lef, rig-1, s1, s);
}
}
}
};