[leetcode] 22. 括号生成

Posted ACBingo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[leetcode] 22. 括号生成相关的知识,希望对你有一定的参考价值。

22. 括号生成

谨慎后,1A的概率貌似高了些
算是20题的升级版吧,
利用递归来拼成string,然后通过20. 有效的括号该题的代码来判断生成的string合不合法

看代码吧

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList<>();
        dfs(ans, "", n, n);
        return ans;
    }

    public void dfs(List<String> list, String st, int left, int right) {
        if (left == 0 && right == 0 && isValid(st)) {
            list.add(st);
        }
        if (left > 0) dfs(list, st + "(", left-1, right);
        if (right > 0) dfs(list, st + ")", left, right-1);
    }

    public boolean isValid(String s) {
        Stack<Character> characterStack = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
            switch (s.charAt(i)) {
                case \'(\':
                case \'[\':
                case \'{\':
                    characterStack.push(s.charAt(i));
                    break;
                case \')\':
                    if (!characterStack.isEmpty() && characterStack.peek() == \'(\') {
                        characterStack.pop();
                        break;
                    } else {
                        return false;
                    }
                case \']\':
                    if (!characterStack.isEmpty() && characterStack.peek() == \'[\') {
                        characterStack.pop();
                        break;
                    } else {
                        return false;
                    }
                case \'}\':
                    if (!characterStack.isEmpty() && characterStack.peek() == \'{\') {
                        characterStack.pop();
                        break;
                    } else {
                        return false;
                    }
            }
        }

        return characterStack.isEmpty();
    }
}

AC后观摩榜单大神的代码,发现其实不必使用isValid()函数判断合法性,

只需保证已经生成的字符串中,左括号的数量>=右括号的数量即可,反过来讲剩余待使用左括号数量要<剩余待使用的右括号数量,否则,当前分支剪掉,代码如下

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList<>();
        dfs(ans, "", n, n);
        return ans;
    }

    public void dfs(List<String> list, String st, int left, int right) {
        if (right < left) return;
        if (left == 0 && right == 0) {
            list.add(st);
        }
        if (left > 0) dfs(list, st + "(", left - 1, right);
        if (right > 0) dfs(list, st + ")", left, right - 1);
    }
}

尼玛优化后居然比优化前慢5ms,严重怀疑leetcode评测机有毛病,代码跑多久看RP

以上是关于[leetcode] 22. 括号生成的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 22. 括号生成c++/java详细题解

leetcode-22 括号生成

leetcode 22 生成括号

leetcode-22括号生成

LeetCode22:括号生成

LeetCode- 22. 括号生成