20.有效的括号

68 阅读1分钟

20.有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

从头遍历,当遇到 '('、'[' 、'{'左括号时,分别入栈')'、']'、'}'

当遍历遇到')'、']'、'}'右括号时,判断栈是否为空:

  • 栈为空,则表示之前没有出现过该右括号相对用的左括号,直接返回false

    image-20240109174327270

  • 栈不为空,弹出栈顶元素,如果和当前右括号不一样,则表示之前没有与该右括号相对应的左括号

    image-20240109174736782

遍历完之后查看栈是否为空,不为空也返回false

image-20240109174339420

public class Problem_0020_ValidParentheses {
	public boolean isValid(String s) {
		if (s == null || s.length() == 0) {
			return true;
		}
		char[] str = s.toCharArray();
		Stack<Character> stack = new Stack<>();
		for (int i = 0; i < str.length; i++) {
			char cha = str[i];
			if (cha == '(' || cha == '[' || cha == '{') {
				stack.add(cha == '(' ? ')' : (cha == '[' ? ']' : '}'));
			} else {
				if (stack.isEmpty()) {
					return false;
				}
				char last = stack.pop();
				if (cha != last) {
					return false;
				}
			}
		}
		return stack.isEmpty();
	}
}