题目:https://oj.leetcode.com/problems/generate-parentheses/
题意:给一个数量n,表示一共需要填的字符串中有多少组括号,然后让你返回的是各种不同的括号组合情况
思路:回溯(也就是暴力),那么有几个问题
1.返回的东西是一个单个的还是多个的(一般都是多个),这道题是把多个string 都存到一个vector,也就是说像遍历一棵树一样,直到叶子节点,那么就会出现一个结果
2.返回的方式是直接return,还是return 一个东西给上一层,依次return回第一层,我感觉基本回溯都是得出叶子节点即可,不用return回去,一般在外面声明一个变量去保存结果(们)就可以了
3.怎么算得到正确结果跳出——这道题就是左右括号都用完了
4.怎么算不正确的结果回溯(这道题里也就是不往下执行了)——这里我想了很久,肯定不可能所有结果都是正确的吧,但是这道题有这么种情况就不用纠错了,那就是,如果得到的string(在递归中的暂时结果)里左括号多余右括号,并且递归函数的过程中,先入左括号再入右括号,那么肯定能得到最终结果,这两个条件用if判断一下,其实也相当于排除了可能错误的结果
5.递归的驱使项是什么——就是剩下的左右括号的数量,一直减,直到为0,则return,相当于结束了。
class Solution {
public:
vector<string> re;
void dfs(string tmp,int left,int right){
if(left ==0 && right ==0)
re.push_back(tmp);
if(left>0)
dfs(tmp+"(",left -1,right);
if(left<right)
dfs(tmp+")",left,right-1);
vector<string> generateParenthesis(int n) {
int left = n;
int right =n;
dfs("",left,right);
return re;
}
};