#每日一题# 22. 括号生成 - 20191016

题目链接

括号生成

题目大意

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

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

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

解题思路

使用回溯+剪枝的思路。回溯也称试探法,就是依据题意以某种顺序(深度优先或广度优先或者其他)尝试构建所有可能的解,然后判断解是否符合题意,若不符合题意则回到之前的步骤去生成下一个可能解。剪枝就是在解的构建过程中加以判断,去除已经不可能成为解的情况。

本题要生成一个 n 对括号组成的有效括号组合,每种组合总共有 2*n 位字符,逐个生成每一位字符就就构建出了所有可能解。在生成过程中,我们记录已生成的串中左括号的个数为 c1,右括号的个数为 c2,只有 c1 == c2 或者 c1 < n 的情况下才能在下一位添加左括号,只有当 c1 > c2 才能在下一位添加右括号,这样就完成了剪枝。参考代码如下。

class Solution {
public:
    vector  ans;
    void generate(string s, int n) {
        if(s.size() == 2*n)
            ans.push_back(s);
        else{
            int c1 = count(s.begin(), s.end(), '(');
            int c2 = count(s.begin(), s.end(), ')');
            if(c1 == c2 || c1 < n)
                generate(s+'(', n);
            if(c1 > c2)
                generate(s+')', n);
        }
    }
    vector generateParenthesis(int n) {
        generate("", n);
        return ans;
    }
};

解题感悟

这个和八皇后问题以及全排列很像。

你可能感兴趣的:(LeetCode,力扣)