代码重构:leetcode 22. 括号生成

232 阅读1分钟

22. 括号生成

看到题目,我们就立即可知,这是一个递归搜索的问题。

但关于同一种思路的建模,有两种:

  1. 递归中,保证右括号总是小于等于左括号,于是返回条件就是右括号数量等于n
  2. 递归中,不控制左右括号关系,但是过程中会进行判断(右括号数目大于左括号时)剪枝,于是返回条件就是左括号和右括号同时等于n

下面给出两种实现代码:

第一种:

    private List<String> ans = new ArrayList<>();

    public List<String> generateParenthesis(int n) {
        dfs(0, 0, n, new StringBuilder());
        return ans;
    }

    private void dfs(int le, int ri, int n, StringBuilder builder) {
        if (ri == n) {
            ans.add(builder.toString());
            return;
        }
        if (le < n) {
            StringBuilder bu = new StringBuilder(builder);
            bu.append('(');
            dfs(le + 1, ri, n, bu);
        }
        if (le > ri) {
            StringBuilder bu = new StringBuilder(builder);
            bu.append(')');
            dfs(le, ri + 1, n, bu);
        }
    }

第二种:

    private List<String> ans = new ArrayList<>();

    public List<String> generateParenthesis(int n) {
        dfs(0, 0, n, new StringBuilder());
        return ans;
    }

    private void dfs(int le, int ri, int n, StringBuilder builder) {
        if (ri == n && le == n) {
            ans.add(builder.toString());
            return;
        }
        if (le > n || ri > n || ri > le) return;
        StringBuilder bu = new StringBuilder(builder);
        bu.append('(');
        dfs(le + 1, ri, n, bu);

        StringBuilder xu = new StringBuilder(builder);
        xu.append(')');
        dfs(le, ri + 1, n, xu);
    }