22.括号生成

22.括号生成

题目:https://leetcode.cn/problems/generate-parentheses

思路

这道题首先可以看出来是排列型回溯。如果我们使用选或不选的方法,也是就在 2 * n 的左括号数组中,填充三个为右括号,然后在 i == n 时判断括号数量是否匹配,是否满足永远右括号数量大于左括号数量即可。这个过程有点麻烦。

所以我们可以考虑在过程中给予约束,我们在过程中保证:1.左括号数量小于n 2.右括号数量大于左括号数量,这样当 i == n 的时候,直接就是符合条件的答案。

这两种方法中,第一种 i 表示位置,第二种 dfs(left, right) 表示目前填了 left 个左括号,right 个右括号(当然你也可以理解为在枚举每个右括号, left为辅助的值)。

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> ans;
        string path(2 * n, 0);

        auto dfs = [&](this auto&& dfs, int left, int right) {
            if (n == right) {
                ans.push_back(path);
                return;
            }

            if (left < n) {
                path[left + right] = '(';
                dfs(left + 1, right);
            }
            if (left > right) {
                path[left + right] = ')';
                dfs(left, right + 1);
            }
        };

        dfs(0, 0);
        return ans;
    }
};