本题是参考别人的思路做的,这两个博客写得很好
https://blog.csdn.net/zjc_game_coder/article/details/78520742
https://blog.csdn.net/w8253497062015/article/details/80001249
题目:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
本题其实并不好做,所用到的方法很巧妙:回溯法,这是我之前没有学过的。以前听说的执行完当前步骤之后往回走一步,听着很玄乎,这程序怎么再跳回到之前的步骤呢?让人很困惑。做这到题的时候,看到参考博客中画的图和代码,一下子就明白了。
通过递归,基本程序里有多个分支(if 语句),一条路走不通,自然就会回到之前的分支。
感谢博主,具体可以参看:https://blog.csdn.net/zjc_game_coder/article/details/78520742
代码:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
fun("",res,n,0,0);
return res;
}
void fun(string cur, vector<string> &res, int n,int left, int right)
{
if(right==n)
{
res.push_back(cur);
}
if(left<n)
{
fun(cur+'(', res, n, left+1,right);
}
if(left>right)
{
fun(cur+')',res,n, left, right+1);
}
}
};