題目描述:
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:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
代碼:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
dfs(0,0,n,"",res);
return res;
}
void dfs(int lNum, int rNum, int pNum, string pS, vector<string>& res){
if(lNum == pNum && rNum == pNum){
res.push_back(pS);
return;
}
if(lNum < pNum) dfs(lNum + 1, rNum, pNum, pS + "(", res);
if(rNum < lNum) dfs(lNum, rNum + 1, pNum, pS + ")", res);
}
};
這個題一直擱置了很久才做,原因是沒有思路。哎,還是算法掌握的不夠牢啊。很簡單的dfs算法。頭結點是左括號,從頭結點開始往下dfs搜索。如果當前左括號個數未滿,則可以加左括號,如果當前右括號的個數小於左括號的個數,則可以加右括號。知道左括號加滿,右括號也加滿爲止,得到一個有效括號串。感覺還是自己把條件想的嚴格了。
靜心盡力!