LeetCode高频题20:有效的括号
提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目
互联网大厂们在公司养了一大批ACM竞赛的大佬们,吃完饭就是设计考题,然后去考应聘人员,你要做的就是学基础树结构与算法,然后打通任督二脉,以应对波云诡谲的大厂笔试面试题!
你要是不扎实学习数据结构与算法,好好动手手撕代码,锻炼解题能力,你可能会在笔试面试过程中,连题目都看不懂!比如华为,字节啥的,足够让你读不懂题
基础知识:
【1】括号匹配问题:判断一个字符串是否为有效的括号匹配
【2】括号匹配问题:括号字符串是否有效匹配,无效的话还需要加多少个括号才能完全匹配
【3】括号匹配问题:括号字符串的最大匹配嵌入深度是多少
【4】括号匹配问题:括号字符串的有效匹配子串最大长度是多少
题目
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一、审题
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
括号问题的系列文章,之间讲得非常清楚
基础知识:
【1】括号匹配问题:判断一个字符串是否为有效的括号匹配
【2】括号匹配问题:括号字符串是否有效匹配,无效的话还需要加多少个括号才能完全匹配
【3】括号匹配问题:括号字符串的最大匹配嵌入深度是多少
【4】括号匹配问题:括号字符串的有效匹配子串最大长度是多少
但是本题不是缺括号那种,而是让你判断给你的括号有没有交错搭配,不合法
上面那个四个题目都是同一个小括号()
只不过看看多了少了,反了正了
本题有三种括号,情况不同,所以解法微微不同
输入:s = “()[]{}”
输出:true
输入:s = “([)]”
输出:false
输入:s = “{[]}”
输出:true
这个括号匹配问题,用栈来解决
(1)从s的i=0位置一次开始压栈,遇到左括号压栈,不管是大中小三种,左括号,压
(2)遇到右括号,不论大中小括号三种,只要是右括号,就弹出一个括号,必须还要和当前括号匹配才行
(3)一旦无法匹配就false,全体都匹配上了就是true,非常简单!
(1)仨左括号,压栈
(2)遇到),弹出一个cur=(所以能匹配
然后再压(,在遇到),弹出匹配
遇到}弹出匹配,遇到]弹出匹配
然后开始压(,遇到)弹出匹配
遇到[压栈,{压栈
然后有独到}弹出配
遇到]弹出匹配
此时i来到N,栈空,OK
true
手撕代码问题不大:
//复习:
//这个括号匹配问题,用**栈**来解决
public boolean isValidReview(String s) {
//(1)从s的i=0位置一次开始压栈,遇到左括号压栈,不管是大中小三种,左括号,压
//(2)遇到右括号,不论大中小括号三种,只要是右括号,就弹出一个括号,必须还要和当前括号匹配才行
//(3)一旦无法匹配就false,全体都匹配上了就是true,非常简单!
if (s.compareTo("") == 0 || s.length() == 0) return true;
if (s.length() < 2) return false;
Stack<Character> stack = new Stack<>();
int N = s.length();
for (int i = 0; i < N; i++) {
char c = s.charAt(i);
if (c == '(' || c == '[' || c == '{') stack.push(c);
else {
//右括号弹出对比
if (stack.isEmpty()) return false;//提前就发现没了,说明问题大了,缺呀
char left = stack.pop();
if ((left == '(' && c == ')') ||
(left == '[' && c == ']') ||
(left == '{' && c == '}')) continue;
else return false;//如果不满足其中一种匹配的条件,失败
}
}
//全部通过,则OK
return stack.isEmpty();
}
测试:
public static void test(){
String s = "(";
String s2 = "[([])]";
Solution solution = new Solution();
System.out.println(solution.isValid(s));
System.out.println(solution.isValidReview(s));
System.out.println(solution.isValid(s2));
System.out.println(solution.isValidReview(s2));
}
public static void main(String[] args) {
test();
}
问题不大
中间搞清楚特殊情况,只有一个字符,或者最开始就遇到了左括号啥的,那就会让提前遇到stack是空,还需要弹出,必然不合法!
false
false
true
true
LeetCode测试:
总结
提示:重要经验:
1)括号匹配问题,有一系列的题目,最开始那几个基础,是只有一种小括号()的情况,然后看合法不合法
2)本题有多重括号,你需要用栈来压入弹出对比,匹配不上就不行。
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。