美文网首页
要成功就做一百题-93

要成功就做一百题-93

作者: 西5d | 来源:发表于2020-08-26 16:07 被阅读0次

题目名称

有效的括号判断

描述

输入的字符串只包含{ [] } ()三种括号的组合,判断输入是否是有效的括号,如下:

//
// 注意空字符串可被认为是有效字符串。 
//
// 示例 1: 
//
// 输入: "()"
//输出: true
// 
//
// 示例 2: 
//
// 输入: "()[]{}"
//输出: true
// 
//
// 示例 3: 
//
// 输入: "(]"
//输出: false
// 
//
// 示例 4: 
//
// 输入: "([)]"
//输出: false
// 
//
// 示例 5: 
//
// 输入: "{[]}"
//输出: true 

解题思路

这里重点就是要判断括号是否是匹配的,比如找到{,就判断对应的}是否存在,但是这样有个问题是比如中间有其他括号,也得判断,整个操作感觉会变得复杂。
换个思路,举一种类型括号的例子。先放一个堆栈,遍历字符串,如果栈是空的或者遍历元素是左括号{,就放进去,遍历到},即右括号的时候,再看看栈中是否有对应左括号{,有的话把左括号放出来,没有就表示非合格的括号,直接返回false,这样一个括号的匹配就完成了,有点倒着处理的意思。最终的栈仍然是空的。

代码

  Map<Character, Character> map = new HashMap<>();
    Set<Character> left = new HashSet<>();
       map.put(')', '(');
            map.put(']', '[');
            map.put('}', '{');
            map.put('(', ')');
            map.put('[', ']');
            map.put('{', '}');
            left.add('[');
            left.add('(');
            left.add('{');
public boolean isValid(String s) {
        if (null == s || "".equals(s)) {
            return true;
        }

        //栈空往里放,不空配对看
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (stack.isEmpty() || left.contains(ch)) {
                stack.push(ch);
            } else {
                char other = stack.peek();
                if (map.get(ch) != null && other == map.get(ch)) {
                    stack.pop();
                }else {
                    return false;
                }
            }
        }
        return stack.size() == 0;
    }

总结

之前还有一种解法,用switch,也能实现,稍微繁琐点,如下供参考。

 public boolean isValid(String s) {
         Stack<Character> stack = new Stack<>();
        char ch;
        for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i);
            switch (ch) {
                case '(':
                    stack.push(ch);
                    break;
                case ')':
                    if (!stack.isEmpty() && stack.peek()=='(') {
                        stack.pop();
                    }else {
                        stack.push(ch);
                    }
                    break;
                case '{':
                    stack.push(ch);
                    break;
                case '}':
                    if (!stack.isEmpty() && stack.peek() == '{') {
                        stack.pop();
                    }else {
                        stack.push(ch);
                    }
                    break;
                case '[':
                    stack.push(ch);
                    break;
                case ']':
                    if (!stack.isEmpty() && stack.peek() == '[') {
                        stack.pop();
                    }else {
                        stack.push(ch);
                    }
                    break;
                    default:
                        return false;
            }
        }
        return stack.isEmpty();
    }

相关文章

  • 要成功就做一百题-93

    题目名称 有效的括号判断 描述 输入的字符串只包含{ [] } ()三种括号的组合,判断输入是否是有效的括号,如下...

  • 要成功就做一百题-90

    题目名称 第十三题 罗马数字转整数 描述 解题思路 这里做了个找规律,先把所有字符加起来,再处理特殊情况,题目说了...

  • 要成功就做一百题-89

    题目名称 实现字符串函数strStr() ,第28题 描述 解题思路 目的是找出某个字符串在另一个字符串的起始位置...

  • 要成功就做一百题-92

    题目名称 括号生成 描述 难度属于中等,目的是根据给定的括号数,生成有效的括号集合。 解题思路 这题比较有意思,这...

  • 要成功就做一百题-91

    题目名称 矩阵置零 描述 难度属于中等,如下是题目的描述,leetcode 73题。 解题思路 这里我也没用其他复...

  • 要成功就做一百题-99

    题目名称 爬楼梯问题,斐波拉契数列,泰波拉契数列 描述 第一个是常见的题目,第二个斐波拉契,第三个是斐波拉契的变种...

  • 要成功就做一百题-98

    题目名称 二叉树的中序遍历 描述 给定一个先序遍历的二叉树,打印出其中序(中根)遍历的结构。 解题思路 首先是根据...

  • 要成功就做一百题-100

    题目有点唬人,当然要的就是这个效果,标题党一把。从现在开始做100道leetcode题目,为了起到比较好的督促作用...

  • 要成功就做一百题-97

    题目名称 今天来一个简单题目试试水,好久没发了。 一来遇到个复杂题,一时没解,二来最近实在有点忙。废话不多,开始正...

  • 要成功就做一百题-95

    题目名称 已经排序的数组,必须在O(logn)的复杂度下统计得到指定元素的重复次数。 描述 比如数组[1,1,2,...

网友评论

      本文标题:要成功就做一百题-93

      本文链接:https://www.haomeiwen.com/subject/ctcfsktx.html