22 generate-parentheses
题目:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
1.递归,最终判断是否是合法的字符串
class Solution {
public:
vector<string> ans;
bool is_valid(string s)
{
int left_cnt = 0, i = 0;
while(i<s.size())
{
if(s[i] == '(')
left_cnt++;
else if(s[i] == ')')
left_cnt--;
if(left_cnt<0)
return false;
i++;
}
return left_cnt == 0;
}
void generate(int level, int n, string s)
{
if(level >= n)
{
if(is_valid(s))
ans.push_back(s);
return ;
}
generate(level+1, n, s+"(");
generate(level+1, n, s+")");
}
vector<string> generateParenthesis(int n) {
generate(0, 2*n, "");
return ans;
}
};
2.递归中剪枝,保证所有的生成的字符串都是合法的,则可以省去最后的判断过程
可以添加左括号的情况:数量<n
可以添加右括号的情况:数量小于左括号
class Solution {
public:
vector<string> ans;
void generate(int l, int r, int n, string s)
{
if(l == n && r == n)
{
ans.push_back(s);
return ;
}
if(l<n)
generate(l+1, r, n, s+"(");
if(r<l)
generate(l, r+1, n, s+")");
}
vector<string> generateParenthesis(int n) {
generate(0, 0, n, "");
return ans;
}
};