leetcode22——Generate Parentheses

题目大意:给出小括号()的总对数,返回一个字符串数组,里面包括这些对的括号所能组成的所有合法字符串

分析:回溯法的应用。又是一道列出所有组合的题,和leetcode17类似,递归求解。设剩余的左右括号数分别是left和right个。

          1.如果left和right都为0就代表此时找到了一个合法的解,将它放入结果数组;

          2.如果left>right,那么已经使用的左括号小于已经使用了的右括号,意味着出现了不合法现象,直接return

          3.判断好了递归退出条件,接下来就是如何递归的问题:

             (1)如果left>0,那么当前字符串加上左括号,继续dfs,注意改变参数

             (2)如果right>0,那么当前字符串加上右括号,继续dfs,注意改变参数

代码:

class Solution {
public:
    vector generateParenthesis(int n) {
        vector ans;
        if(n == 0) return ans;
        dfs("",n,n,ans);
        return ans;
    }
    void dfs(string tmp,int left,int right,vector& ans){
        if(left > right) return;
        if(left == 0 && right == 0){
            ans.push_back(tmp);
            return;
        }
        if(left > 0) dfs(tmp + '(',left - 1,right,ans);
        if(right > 0) dfs(tmp + ')',left,right - 1,ans);
    }
};

 

你可能感兴趣的:(搜索-回溯法)