LeetCode | 20 ValidParentheses

分析

  • 括号成对出现,键值对类型
  • 括号字符序列嵌套出现,不能错位,顺序具有对称性

为什么不用数组这种数据结构来记录数量?因为这种方法不能保证括号的正确顺序。例如,字符串'({[)}]'会被认为是有效的。

栈解决有效括号问题

  • 当遇到一个左括号时,我们需要记住它,以便在后续遇到相应的右括号时能够正确地匹配
  • 当遇到一个右括号时,我们需要检查最近的一个左括号是否与之匹配

进栈和出栈,相当于完成了一次镜像反射。在括号匹配这种具有顺序性和对称性的结构问题上,栈完美符合其要求。

队列:遵循FIFO原则,适用于需要按照元素加入顺序处理数据的场景
栈:遵循LIFO原则,适用于需要按照元素加入的逆序处理数据的场景

拓展
LeetCode 1047,这个消消乐问题跟本题有点类似,不过这道题不需要逆序,最好用队列来做

主类

public class ValidParentheses {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        Map<Character, Character> parenthessesMap = new HashMap<>();
        parenthessesMap.put(')', '(');
        parenthessesMap.put('}', '{');
        parenthessesMap.put(']', '[');

        for (char c : s.toCharArray()) {
            if (parenthessesMap.containsValue(c)) {
                // 如果是左括号,压入栈
                stack.push(c);
            } else if (parenthessesMap.containsKey(c)) {
                if (stack.isEmpty() || !stack.pop().equals(parenthessesMap.get(c))) {
                    return false;
                }
            } else {
                return false;
            }
        }

        return stack.isEmpty();
    }
}

测试类

public class ValidParenthesesTest {

    @Test
    public void test_ValidParentheses() {
        ValidParentheses validParentheses = new ValidParentheses();
        System.out.println(validParentheses.isValid("(())"));
        System.out.println(validParentheses.isValid("(()]])"));
        System.out.println(validParentheses.isValid("({}{}())"));

    }
}

posted @ 2024-08-10 17:51  Neking  阅读(9)  评论(0编辑  收藏  举报