22. 括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]
解题思路——
本题是利用溯源算法去解的,溯源算法可以理解为是一种试探性的全局搜索。穷举出每一种可能性,把所有成功的解都返回解空间的一种算法。
对于本题很适用,另外,我是采用的递归来解决的这个问题。
1. 首先我们来介绍一下递归的一般用法。
大问题
回归的条件。
回归的操作。
选择1
选择1的递归
选择2
选择2的递归
选择n
选择n的递归

合并所有解至解空间。
end

其中重点就是找到递归的传递关系,在理解递归的时候不要进入函数的内部做嵌套,而应该把他理解成一个黑盒子。
彻底把函数抽象出来,只考虑函数的输入输出,实现效果。

2.在本题中,重点是找到递归的思路。
回归条件:如果左右括号都没了,那么把解返回解空间。
选择条件1:如果左括号还有,那么就递归。
递归关系: 如果左括号还有,那么就用掉一个左括号(字符串+“(”,函数中left-1)
选择条件2:如果左括号剩余数量小于右括号剩余数量,那么就递归。
递归关系: 用掉一个右括号




class Solution {
public:
    void backtrade(string sublist,vector& res,int left,int right)
    {
        if(left == 0 && right == 0)
        {
            res.push_back(sublist);
            return;
        }
        if(left > 0)
        {
           backtrade(sublist+"(",res,left-1,right);
        }
        if(left < right)
        {
            backtrade(sublist+")",res,left,right-1);
        }
            
        
    }
    
    
    vector generateParenthesis(int n) {
        vector res;
        backtrade("",res,n,n);
        return res;
    }
}; 


你可能感兴趣的:(LeetCode)