LeetCode高频题20:有效的括号

LeetCode高频题20:有效的括号

提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目
互联网大厂们在公司养了一大批ACM竞赛的大佬们,吃完饭就是设计考题,然后去考应聘人员,你要做的就是学基础树结构与算法,然后打通任督二脉,以应对波云诡谲的大厂笔试面试题!
你要是不扎实学习数据结构与算法,好好动手手撕代码,锻炼解题能力,你可能会在笔试面试过程中,连题目都看不懂!比如华为,字节啥的,足够让你读不懂题
在这里插入图片描述
基础知识:
【1】括号匹配问题:判断一个字符串是否为有效的括号匹配
【2】括号匹配问题:括号字符串是否有效匹配,无效的话还需要加多少个括号才能完全匹配
【3】括号匹配问题:括号字符串的最大匹配嵌入深度是多少
【4】括号匹配问题:括号字符串的有效匹配子串最大长度是多少


文章目录

  • LeetCode高频题20:有效的括号
    • @[TOC](文章目录)
  • 题目
  • 一、审题
  • 括号问题的系列文章,之间讲得非常清楚
  • 但是本题不是缺括号那种,而是让你判断给你的括号有没有交错搭配,不合法
  • 总结

题目

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 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,非常简单!
LeetCode高频题20:有效的括号_第1张图片
(1)仨左括号,压栈
(2)遇到),弹出一个cur=(所以能匹配
然后再压(,在遇到),弹出匹配
LeetCode高频题20:有效的括号_第2张图片
遇到}弹出匹配,遇到]弹出匹配
然后开始压(,遇到)弹出匹配
LeetCode高频题20:有效的括号_第3张图片
遇到[压栈,{压栈
LeetCode高频题20:有效的括号_第4张图片
然后有独到}弹出配
遇到]弹出匹配
LeetCode高频题20:有效的括号_第5张图片
此时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测试:
LeetCode高频题20:有效的括号_第6张图片
LeetCode高频题20:有效的括号_第7张图片


总结

提示:重要经验:

1)括号匹配问题,有一系列的题目,最开始那几个基础,是只有一种小括号()的情况,然后看合法不合法
2)本题有多重括号,你需要用栈来压入弹出对比,匹配不上就不行。
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

你可能感兴趣的:(大厂面试高频题之数据结构与算法,leetcode,括号匹配,有效括号字符串,字符串,括号有效匹配)