题目:
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:
"((()))", "(()())", "(())()", "()(())", "()()()"
思路:有n组括号,就有2n个符号,进行枚举,每次选择'('或者')',然后对无效的进行剪枝操作;
以前判断一个字符串是否是合法的括号组合是用栈进行判断,碰到左括号进行入栈操作,碰到右括号进行出栈操作,如果碰到右括号的时候栈为空,则是非法的,如果最后栈为空则是合法的。
class Solution {
public:
vector<string>res;
string str;
stack<char>S;//辅助栈,用于判断组合是否合法
void backtracking(int dep,int maxdep)
{
if (dep == maxdep)
{
if (S.empty())//栈空表明是合法的的字符串
{
res.push_back(str);
}
return;
}
str.push_back('('); //先添加左括号
S.push('(');//栈也跟着添加左括号
backtracking(dep + 1, maxdep);
str.pop_back();//回退
S.pop();//回退
str.push_back(')');//添加右括号
if (!S.empty())//辅助栈不空,表明还有左括号
{
S.pop();//弹出一个左括号
backtracking(dep + 1, maxdep);
S.push('(');//回退左括号
str.pop_back();//回溯
}
else{//剪枝操作,栈为空,则表明不匹配,不继续往下找,只是回退
str.pop_back();
}
}
vector<string> generateParenthesis(int n) {
backtracking(0, 2 * n);//2n的深度,总共有2n个符号
return res;
}
};
PS:代码还是有可以优化的地方的,碰到左括号或者右括号的数大于n就可以剪枝了,先这样吧,反正AC了。