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;
        }
    }
    
    
    
  • 相关阅读:
    div+css 兼容 ie6 ie7 ie8 ie9和FireFox Chrome等浏览器方法
    cocos2dx Error:不允许使用继承成员
    NSKeyedArchiver和NSKeydUnarchiver
    Undefined symbols for architecture i386: _OBJC_CLASS_$_SKPSMTPMessage", referenced from: error
    WBShareKit
    PHP(二)
    cocos2d从Url获得图片数据创建CCSprite
    iPhone获取设备的相关信息
    python发人人状态
    [WARN]Warning: Multiple build commands for output file /
  • 原文地址:https://www.cnblogs.com/cosefy/p/13068016.html
Copyright © 2011-2022 走看看