LeetCode OJ-22.Generate Parentheses(回溯法)
题目描述
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:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
Subscribe to see which companies asked this question
题目理解
给定一个整数n,代表n对括号,”()”算一对,以n对括号,求解所有合法的括号组合组合,举个例子:”()”就是合法的,然而”)()”就是不合法的。这题可以使用回溯法解决,并不会超时。这里有一个恒成立的条件,在任意位置,该位置之前的左半括号数必定大于或等于右半括号数。回溯时,根据上面的这个条件进行判断选择添加左半括号还是右半括号。以(left + right) / 2是否为n作为结束的判断条件,具体代码如下,其中附带一些关键解释:
Code
void back_trace(int n, int left, int right, string &tmp, vector<string> &res)
{
if (left > n || right > n) { //左半括号右半括号数不能超过n
return ;
}
if ((left + right) / 2 == n) { //已完成一种括号匹配,左半括号右半括号成功合法匹配
res.push_back(tmp);
return ;
}
else {
if (left > right) { //左半括号数大于右半括号数,可以选择在该位置添加任意一种
tmp.push_back('(');
back_trace(n, left + 1, right, tmp, res); //添加左半括号,并回溯处理
tmp.pop_back();
tmp.push_back(')');
back_trace(n, left, right + 1, tmp, res); //添加右半括号,并回溯处理
tmp.pop_back();
}
else if (left == right) { //左右括号数相等,只能添加左括号
tmp.push_back('(');
back_trace(n, left + 1, right, tmp, res);
tmp.pop_back();
}
else { //非法情况,直接返回
return ;
}
}
}
vector<string> generate_parenthesis(int n)
{
vector<string> res;
string tmp("");
back_trace(n, 0, 0, tmp, res);
return res;
}