zoukankan      html  css  js  c++  java
  • 括号匹配-算法详细题解LeetCode

    题目:有效的括号

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
    有效字符串需满足:
    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。

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

    示例 1:

    输入: "()"
    输出: true
    

    示例 2:

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

    示例 3:

    输入: "(]"
    输出: false
    
    /**
     * @author cosefy
     * @date 2020/6/8
     */
    
    public class ValidParenthesis {
        public static void main(String[] args) {
            String s = "";
            System.out.println(s);
            boolean b = isValid_Test1(s);
            boolean b = isValid_Test2(s);
            System.out.println("结果是: " + b);
        }
    
        //解法一:采用栈的辅助
        /*
        思路:循环遍历字符串,遇到左括号就压栈,否则就出栈,出栈时判断栈是否为空,遍历结束后,记得判断栈空。
        分析:一趟遍历,时间复杂度为O(n)
        易错点:注意栈空的判断
        思考:
            -执行用时很少,但内存消耗有点多,考虑是否有办法节约内存。
            -可以判断字符串的长度是否为0或者为奇数,直接返回结果
         */
        public static boolean isValid_Test1(String s) {
            if (s.length() == 0)
                return true;
            if (s.length() % 2 != 0)
                return false;
            Stack<Character> stack = new Stack<>();
            for (char c : s.toCharArray()) {
                if (c == '(' || c == '{' || c == '[') {
                    stack.push(c);
                } else {
                    if (stack.isEmpty())
                        return false;
                    char cc = stack.pop();
                    if ((cc == '(' && c != ')') || (cc == '{' && c != '}') || (cc == '[' && c != ']'))
                        //上述判断语句也可用HashMap存储三对括号来查询实现。
                        return false;
                }
    
            }
            return stack.isEmpty();
        }
    
        //解法二:数组辅助实现
        /*
        思路:开辟一个数组存放字符,利用一个变量来访问数组,若遍历到左括号,变量自加1,否则变量自减1,
        分析:此方法相对来说用时更少。
         */
    
        public static boolean isValid_Test2(String s) {
            if (s.length() == 0)
                return true;
            if (s.length() % 2 != 0)
                return false;
            char[] chars = new char[s.length()];
            int index = -1;
            for (char c : s.toCharArray()) {
                if (c == '(' || c == '{' || c == '[') {
                    index++;
                    chars[index]=c;
                }else {
                    if(index==-1)
                        return false;
                    if(c==')'&&chars[index]=='('||
                            c=='}'&&chars[index]=='{'||
                            c==']'&&chars[index]=='[')
                        index--;
                }
            }
            return index==-1;
        }
    }
    
    
    
  • 相关阅读:
    js 使用${}解析变量代替++
    laravel 返回自定义错误
    Java集合之HashMap源码解析
    Java集合之ArrayList源码解析
    Java集合之LinkedList源码解析
    保证消息可靠性传输以及幂等性
    Java分布式系统---消息中间件
    Java中的日期与时间
    Java时区问题
    数据测试002:利用Jmeter推送测试数据(上)
  • 原文地址:https://www.cnblogs.com/cosefy/p/13068016.html
Copyright © 2011-2022 走看看