分析:按照括号匹配规则递归穷举
设有3个左括号,3个右括号,(((
此时左括号用完了,只能顺势接右括号,((()))所有括号用完结束
递归退回((
此时还可以再接右括号(()
穷举继续接左括号(()(
3个左括号用完,顺势接两个右括号(()()) 所有括号用完结束
递归退回
(()
此时还可以继续接右括号
(())
此时穷举继续接左括号(())(
3个左括号用完,顺势接一个右括号(())() 所有括号用完结束
...
此时还有一个问题,就是什么时候可以接右括号,当没有左括号是,直接加右括号,就不合法,所以需要一个变量记录当前有多少个左括号待匹配
class Solution {
public:
vector<string> res;
void f(int lc, int rc, int t, string temp)
{
if (lc == rc && rc == 0)
{
res.push_back(temp);
return;
}
else
{
if (lc > 0)
{
f(lc - 1, rc, t + 1, temp + '(');
if (rc > 0 && t > 0)
{
f(lc, rc - 1, t - 1, temp + ')');
}
}
else
{
f(lc, rc - 1, t - 1, temp + ')');
}
}
}
vector<string> generateParenthesis(int n) {
string temp = "";
f(n, n, 0, temp);
return res;
}
};