LeetCode:有效的括号

773 阅读1分钟

一、题目描述

二、思路分析

2.1 分析

本题是判断给的字符串包含的括号是否有效。

  1. 第一种做法是一旦发现字符串有正确的括号出现,立马用空串取代。如果字符串最后为空,说明字符串包含的括号是有效的。但这样做的效率非常低下,对内存和时间都有很大影响,仅供参考。
  2. 第二种做法是利用栈的先进后出的特点。遍历字符串的每个字符,如果遇到左半边的括号('('、'['、'{'),将其入栈。如果遇到右半边的括号(')'、']'、'}'),将当前栈顶的括号出栈。如果发现栈为空或者不匹配,直接返回 false。如果匹配,接着遍历字符串的下一个字符。最后字符串遍历完毕且栈为空,说明所有的括号都匹配。

2.2 图解

三、题解

有效的括号的实现

  • 做法一
class Solution {
    public boolean isValid(String s) {
		while (s.contains("()") || s.contains("{}")
        || s.contains("[]")) {
            s = s.replace("()", "");
            s = s.replace("{}", "");
            s = s.replace("[]", "");
        }
        return s.isEmpty();
    }
}
  • 做法二
class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            // 取出每一个字符
            char ch = s.charAt(i);
            // 取出的字符是左半边括号,入栈
            if (ch == '(' || ch == '[' || ch == '{') {
                stack.push(ch);
            }
            // 取出的字符是右半边括号
            if (ch == ')' || ch == ']' || ch == '}') {
                // 当前栈是空的,说明没有匹配
                if (stack.isEmpty()) {
                    return false;
                }
                // 栈不为空,将当前栈顶括号出栈
                char top = stack.pop();
                // 出现不匹配
                if (ch == ')' && top != '(') {
                    return false;
                }
                if (ch == ']' && top != '[') {
                    return false;
                }
                if (ch == '}' && top != '{') {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}