为了给想在秋招突击冲刺的小伙伴加油助威,小编这里准备了一份 Java 八股文面试题,有需要的小伙伴可以 关注公众号,回复关键词 「1024」 获得。
速刷一遍,查漏补缺!!!
想 系统刷题 的小伙伴也可以点击链接了解下 八股文小程序 ,助力面试顺利,Offer 拿到手软!!!
言归正传,今天我们继续来学习 「力扣高频题」 系列。
20. 有效的括号
给定一个只包括 (
、)
、{
、}
、[
、]
的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入: s = “()”
输出: true
示例 2:
输入: s = “()[]{}”
输出: true
示例 3:
输入: s = “(]”
输出: false
- 提示:
- 1 <= s.length <= 1 0 4 10^4 104
- s 仅由括号
()[]{}
组成
思路分析
学习过数据结构的小伙伴都知道,在栈的应用
中就讲到了最经典的括号匹配问题,利用栈先进后出
的特性完美适用该问题。
逻辑 :
开辟一个栈空间,依次遍历字符串 s 。
如果是
左括号
,压入栈中。如果是
右括号
,弹出栈顶元素与其进行比较,若能匹配成功(相同类型),继续遍历,直到全部匹配结束。字符串遍历完成后,若栈中
仍有元素(非空)
,则不是有效的括号。
注意:
- 为了在弹出栈后方便比较,在遇到左括号压栈时,实际上压入的是右括号。
- 匹配失败的三种情况:
代码
public static boolean isVaild(String s) {
if (s == null || s.length() == 0) {
return true;
}
char[] str = s.toCharArray();
// 开辟栈,用来存储括号
Stack<Character> stack = new Stack<>();
// 遍历 s 字符串
for (int i = 0; i < str.length; i++) {
char cha = str[i];
// 遇到左括号,压栈
if (cha == '(' || cha == '[' || cha == '{') {
// 这里为了接下来 与 '右括号' 比较起来更方便
// 选择压入对应的 '右括号'
stack.add(cha == '(' ? ')' : (cha == '[' ? ']' : '}'));
} else {
// 大前提:
// 1. 字符串没有结束
// 2. 当前字符 cha 是右括号
//
// 如果此时栈已经空了,
// 说明找不到与此时 cha 所对应的左括号了(右括号多)
// 例如: ())))
// 情况 1
if (stack.isEmpty()) {
return false;
}
// 栈不空,弹出栈顶元素
char last = stack.pop();
// 由于之前压栈的是左括号对应的右括号
// 因此若二者字符相同,则表示能匹配成功
// 情况 2
if (cha != last) {
return false;
}
}
}
// 字符串结束,栈中不能剩余多余的左括号
// 反例: (((()) ,结束后栈不为空(左括号多),不是有效的括号
// 情况 3
return stack.isEmpty();
}
最后
上次给大家介绍的 面试八股文小程序 评价 杠杠滴~~
最近又和朋友一起合作开发了算法全套刷题 ,专门针对于 解决面试中算法问题 学习的课程,有需要的小伙伴可以去看看,保证你在面试中如鱼得水。
~ 点赞 ~ 关注 ~ 星标 ~ 不迷路 ~!!!
回复「1024」获取 Java 面试资源 ~
回复「ACM紫书」获取 ACM 算法书籍 ~
回复「算法导论」获取 算法导论第3版 ~
在看 + 转发
让你的小伙伴们一起来学算法吧!!