Leetcode题库-有效的括号(java语言版)

题目描述:

  

给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

输入: "([)]"
输出: false

示例 5:

输入: "{[]}"
输出: true

这道题,看起来有点无从下手,其实很简单,这道题用到了一种数据结构---栈。

简单介绍一下,栈一种线性表,允许在栈的一段进行插入删除。是一种后进先出的线性表。

明白了栈的基本概念,这道题就解决了。

思路很简单,就是将所有左括号入栈,然后判断输入的括号中是否有与栈中的左括号相匹配的,如果有就出栈,没有就返回false,最后判断栈是否为空,为空则为true,否则false.

例如:输入“{【()】}”将{,[,(入栈,然后判断出栈元素(与)是否匹配,匹配则继续寻找,继续出栈。

代码如下:

 public static void main(String[] args){
//        第一种,将左边括号入栈,出栈时判断是否与与右边括号匹配.
        String str = "{{{{{{()}}}}}}}";
//        栈,用栈最简单(栈的特点后进先出)
        Stack<Character> s = new Stack <> ();

        for (int i=0;i<str.length ();i++){
//            将字符串的元素付给char变量
            char c = str.charAt ( i );
//            当是左边括号是入栈
            if (c=='('||c=='['||c=='{'){
                s.push ( c );
                continue;
            }
//            将出栈元素赋值给char变量
            char pop=s.pop ();
//            当出栈元素(左边括号)和字符串中除了左边括号后的其他括号匹配时,继续执行,否则报错,不相等,不是正确括号.
            if(pop=='('&&c==')'||pop=='['&&c==']'||pop=='{'&&c=='}') {
            }
            else{
              System.out.println("出栈元素与剩与元素不相同");
            }
        }
        if(s.isEmpty ()){
            System.out.println("成功");
        }else {
            System.out.println("栈不为空失败");
        }
pop=='('&&c==')'||pop=='['&&c==']'||pop=='{'&&c=='}')主要说这句话,判断出栈元素有没有匹配的元素,有就继续执行,没有就报错。

执行结果:

执行用时:

还有一种方法,也是用栈,不过使用map来做,执行时间有点长,但是也是一种很好理解的方法。都是将左边括号入栈,判断有没有与map中的值相同的元素,也就是能不能找到与左括号匹配的元素,找到就出栈,栈空则结束。

Stack<Character> s = new Stack <> ();
Map<Character,Character> map = new HashMap <> (  );
        map.put('{','}');
        map.put('(',')');
        map.put('[',']');
        for (int i=0; i<str.length ( ); i++){
            if (map.get ( str.charAt ( i ) )!=null){
                 s.push ( str.charAt ( i ) );
            }
            else if (s.size()>0&&map.get(s.peek()).equals(str.charAt ( i ))){
                s.pop ();
            }else {
                System.out.println("错误");
            }
        }
        if (s.isEmpty ()){
            System.out.println("成功");
        }

执行用时:

这一种方法虽然没有第一种用时短,但也是一种很好理解,简便的方法。

总结:

 这道题要是用暴力解法,可能要考虑的情况太多,代码量太多。本人这道题曾经在老师的数据结构课中遇到过,所以直接想到了用栈,虽然java栈的方法,不熟悉,但目标有了,实现也不是很费劲。

这道题很有价值,很值得的去多做几遍。多思考,本人java语法有点不熟悉,通过这个题,也对java栈语法有了更好的认识。继续努力。

2019-1-21记录

发布了43 篇原创文章 · 获赞 6 · 访问量 6688

猜你喜欢

转载自blog.csdn.net/weixin_37850160/article/details/86586875