zoukankan      html  css  js  c++  java
  • 【算法】LeetCode算法题-Valid Parentheses

    这是悦乐书的第147次更新,第149篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第6题(顺位题号是20),给定一个只包含字符'(',')','{','}','['和']'的字符串,确定输入字符串是否有效。输入的字符串必须使用相同类型的括号关闭左括号,并且以正确的顺序关闭左括号。如果输入空串,返回true。例如:

    输入: "()"
    输出: true

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

    输入: "([)]"

    输出: false

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

    本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

    02 第一种解法

    利用字符串的替换方法。左括号和右括号必须一起出现,无论其里层还是外层有多少层,如"{()}","()"的外面有一层"{}",或者"{}"的里层是"()",将里面的"()"替换为空串,剩下"{}"再替换为空串,最后为空串,返回true。

    public boolean isValid(String s) {
        boolean flag = false;
        if (s.isEmpty()) {
            return true;
        }
        String s2 = s;
        for (int i=0; i<s.length()/2; i++) {
            s2 = s2.replaceAll("\(\)", "");
            s2 = s2.replaceAll("\{\}", "");
            s2 = s2.replaceAll("\[\]", "");
            if (s2.length() == 0) {
                return true;
            }
        }
        return flag;
    }
    

    03 第二种解法

    利用栈后进先出的特点。将左括号开头的字符依次存入栈中,遇到右括号时,从栈中取出进栈的数据,如果是一对左右括号,继续循环,反之返回false。
    字符串"{()}",将其拆分为四个字符'{','(',')','}',第1次循环进栈字符是'{',第2次循环进栈字符是'(',第三次循环遇到右括号')',从栈中取出数据'(',判断是否为一对。依次往后循环判断。

    public boolean isValid2(String s) {
        Stack<Character> pare_stack = new Stack<Character>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch(c) {
            case '(':
            case '[':
            case '{': 
                pare_stack.push(c);
                break;
            case ')' :
                    if (pare_stack.isEmpty()) {
                        return false;
                    } else {
                        if (pare_stack.pop() == '(') {
                            break;
                        } else {
                            return false;
                        }
                    }
            case ']' :
                    if (pare_stack.isEmpty()) {
                        return false;
                    } else {
                        if (pare_stack.pop() == '[') {
                            break;
                        } else {
                            return false;
                        }
                    }
            case '}' :
                    if (pare_stack.isEmpty()) {
                        return false;
                    } else {
                        if (pare_stack.pop() == '{') {
                            break;
                        } else {
                            return false;
                        }
                    }
            }
        }
        return pare_stack.isEmpty();
    }
    

    04 第三种解法

    利用数组。遇到左括号,将右括号放进数组;遇到右括号,取数组最后一位匹配,匹配上则删除数组最后一位元素继续循环,匹配不上则返回false。

    public boolean isValid3(String s) {
        List<String> nextClose = new ArrayList<>();
        if (s.length() == 0) {
            return true;
        }
        if (")]}".indexOf(s.charAt(0)) != -1) {
            return false;
        }
        for (int i = 0; i < s.length(); i++) {
            try {
                switch (s.charAt(i)) {
                case '(':
                    nextClose.add(")");
                    break;
                case '[':
                    nextClose.add("]");
                    break;
                case '{':
                    nextClose.add("}");
                    break;
                case ')':
                    if (nextClose.get(nextClose.size() - 1) != ")") {
                        return false;
                    } else {
                        nextClose.remove(nextClose.size() - 1);
                    }
                    break;
                case ']':
                    if (nextClose.get(nextClose.size() - 1) != "]") {
                        return false;
                    } else {
                        nextClose.remove(nextClose.size() - 1);
                    }
                    break;
                case '}':
                    if (nextClose.get(nextClose.size() - 1) != "}") {
                        return false;
                    } else {
                        nextClose.remove(nextClose.size() - 1);
                    }
                    break;
                }
            } catch (ArrayIndexOutOfBoundsException e) {
                return false;
            }
        }
        return nextClose.size() == 0;
    }
    
    

    05 小结

    此题解法远不止上面这三种,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

    本文首发于我的个人公众号:悦乐书,转载请注明出处!

  • 相关阅读:
    [文档].艾米电子 移位寄存器,Verilog
    [书籍].Pong P. Chu FPGA Prototyping By Verilog Examples
    [转载].FPGA三国志
    [笔记].电机行业常用的中英文对照
    [原创][连载].基于SOPC的简易数码相框 – Nios II SBTE部分(软件部分) 配置工作
    [转载].振南带你入门FAT32文件系统 视频
    [文档].艾米电子 在综合中使用函数,Verilog
    [转载].阿迪老师 《SD卡入门到精通》视频
    [文档].艾米电子 寄存器,Verilog
    [笔记].怎样消除pointer targets in passing argument n of 'func_xxx' differ in signedness警告
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/9820948.html
Copyright © 2011-2022 走看看