本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
缘聚缘散缘如水,背负万丈尘寰,只为一句,等待下一次相逢。
文章首发于公众号 “蘑菇睡不着”,更多精彩内容欢迎关注
一、题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
二、思路分析:
这道题的就是讲括号成对成对匹配,这个可以借助数据结构 栈 来实现,栈 的特点是先进后出,咱们先遍历字符串,将括号对左侧压入栈中,当遇到不是括号对左侧的就弹出栈的最顶元素,如果能匹配成括号对,那么就继续遍历,匹配不上代表不符合条件。
三、AC代码
class Solution {
public static boolean isValid(String s) {
// 如果为空,或者长度小于2,或者长度不是偶数 都不符合条件
if (s == null || s.length() < 2 || s.length() % 2 != 0) {
return false;
}
// 预先存储 括号对
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();
}
public static void main(String[] args) {
System.out.println(isValid("()"));
}
}
时间复杂度:O(n),其中 n 是字符串的长度,要遍历一次字符串
空间复杂度:O(n + 6),n 是栈存储的空间,存储 n 个字符,6 是map中存储的字符。
四、总结
这道题难点就是选择正确的数据结构,正确的数据结构能够事半功倍。