(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);
}
}
}
};