力扣有效的括号

70 阅读1分钟

image.png 方法一:使用栈

import java.util.Stack;

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/45f2925390554bfdbda17955a042e1c6~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=800&h=281&s=19748&e=png&b=ffffff)
public class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            if (c == '(' || c == '{' || c == '[') {
                stack.push(c);
            } else {
                if (stack.isEmpty()) {
                    return false;
                }
                char top = stack.pop();
                if (c == ')' && top != '(') {
                    return false;
                }
                if (c == '}' && top != '{') {
                    return false;
                }
                if (c == ']' && top != '[') {
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}

为什么要这么写:

  1. 使用栈可以方便地处理括号匹配问题,遇到左括号就入栈,遇到右括号就出栈并判断是否匹配。
  2. 如果栈为空,说明没有对应的左括号,返回false。
  3. 如果遍历完字符串后栈不为空,说明有未匹配的左括号,返回false。
  4. 如果遍历完字符串后栈为空,说明所有括号都匹配成功,返回true。

方法二:使用哈希表

import java.util.HashMap;
import java.util.Map;

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

        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            if (map.containsKey(c)) {
                if (stack.isEmpty() || stack.pop() != map.get(c)) {
                    return false;
                }
            } else {
                stack.push(c);
            }
        }
        return stack.isEmpty();
    }
}

为什么要这么写:

  1. 使用哈希表可以将字符与对应的左括号进行映射,方便查找。
  2. 遍历字符串时,如果当前字符是右括号,就从栈中弹出一个元素并与当前字符进行比较,如果不匹配则返回false。
  3. 如果遍历完字符串后栈为空,说明所有括号都匹配成功,返回true。