LeetCode 20. 有效的括号

35 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

1.描述

20. 有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。  

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

 

提示:

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

2.分析

对这道题 我们先观察题目规律

  1. 遇到左括号就入栈
  2. 遇到右括号就出栈,将出栈的 与现在的右括号在键值对中对应的括号作比较 若不相等就说明不是有效字符串 相等则继续比较

注意 :

  1. 若栈空了使用pop出栈会报错!
  2. 若经过以上遍历之后 栈里还有元素 则同样说明不是有效字符串

3.AC代码

class Solution {
public boolean isValid(String s) {
		Map<Character, Character> map = new HashMap<Character, Character>();
		map.put(')', '(');
		map.put(']', '[');
		map.put('}', '{');
		Stack<Character> st = new Stack<>();
		char[] a = s.toCharArray();
		if (a.length%2!=0) {
			return false;
		}
		for (char c : a) {
			if(c=='('||c=='['||c=='{') {
				st.push(c);
			}else {
				if(st.empty()) {
					return false;
				}
				if(st.pop()!=map.get(c)) {
					return false;
				}
			}
		}
		if(!st.empty()) {
			return false;
		}else {
			return true;
		}
	}
}

4.总结

这个其实就是栈的实现的过程,如果理解栈的话,那很容易的就能解答出本题,如果不会也没事,看看题解区的大佬的思路,还有很多的动画教程,非常的象形生动。

这个大佬的动画很详细,可以学习学习。有效的括号(辅助栈法,极简+图解)

参考

逐步分析,图解栈(栈是最标准的解法,大家不要争了) - 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)

[小白]Python3 《有效的括号》(ascii码操作) - 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)