【算法】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 小结

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

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

posted @ 2018-10-20 11:02  程序员小川  阅读(403)  评论(0编辑  收藏  举报