题目描述
这是 LeetCode 上的 20. 有效的括号,难度为 简单。
关键字:
栈、哈希表
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
解题思路
判断括号的有效性:我们一般使用 栈(先进后出) 这个数据结构来解决问题。
遍历字符的时候,我们可以先把 左括号 ( [ { 压入栈内,是 右括号 ) ] } 的时候,与栈顶元素进行比较是否匹配,匹配成功左括号出栈,否则右括号入栈。如果是字符串是有效括号,最终栈是空的,因此我们直接判断栈到最后是否为空即可。
class Solution {
public boolean isValid(String s) {
if (s.length() % 2 == 1) {
// 如果是奇数,直接返回不符合
return false;
}
// 建立一个哈希表,存储括号的值,注意匹配和奇偶
HashMap<Character, Character> map = new HashMap(3);
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
// 初始化一个栈对象
Stack stack = new Stack();
// 遍历字符串
char[] cs = s.toCharArray();
for (char c : cs) {
if (map.containsKey(c)) {
// 如果是右括号
if (stack.isEmpty() || stack.peek() != map.get(c)) {
// 如果是空的 或者 右括号没有匹配左括号,则失败
return false;
} else {
stack.pop();
}
} else {
// 如果是左括号直接入栈
stack.push(c);
}
}
// 如果最后栈空了,说明完美匹配,及成功
return stack.isEmpty();
}
}
引用
我的 github 仓库已经同步建立,点击访问