【LeetCode解答九】Valid Parentheses问题Java解答

Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.

The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not.

以上是题目要求,一开始理解错题意,以为两个匹配括号必须相邻,这有何难??但是后来掐指一算发现事情并不简单,于是自然而然地想到了用栈来解决问题,顺便学习一下在Java中如何使用Stack类来解决栈的相关问题。

思路很简单,遇到( [ {后就入栈,遇到] ) }就匹配栈顶字符,如果匹配成功则出栈,如果匹配不成功或栈为空则返回false。

代码:

package Q20ValidParentheses;

import java.util.Scanner;
import java.util.Stack;

/**
 * @author 单继重
 * @since 2017/11/13 19:57
 */
public class Solution {
    public static boolean isValid(String s) {
        //题意理解错误
//        String[] strings = s.split("");
//        if (strings.length % 2 == 1) {
//            return false;
//        }
//        for (int i = 0 ; i < strings.length - 1 ; i += 2) {
//            switch (strings[i]) {
//                case "(":
//                    if (!strings[i + 1].equals(")")) {
//                        return false;
//                    }
//                    break;
//                case "{":
//                    if (!strings[i + 1].equals("}")) {
//                        return false;
//                    }
//                    break;
//                case "[":
//                    if (!strings[i + 1].equals("]")) {
//                        return false;
//                    }
//                    break;
//                default:
//                    return false;
//            }
//        }
//        return true;
        Stack stringStack = new Stack<>();
        String[] strings = s.split("");
        if (strings.length % 2 == 1) {
            return false;
        }
        for (String string : strings) {
            switch (string) {
                case "(":
                    stringStack.push("(");
                    break;
                case "{":
                    stringStack.push("{");
                    break;
                case "[":
                    stringStack.push("[");
                    break;
                case ")":
                    if (stringStack.isEmpty()) {
                        return false;
                    } else if (stringStack.peek().equals("(")) {
                        stringStack.pop();
                    } else {
                        return false;
                    }
                    break;
                case "]":
                    if (stringStack.isEmpty()) {
                        return false;
                    } else if (stringStack.peek().equals("[")) {
                        stringStack.pop();
                    } else {
                        return false;
                    }
                    break;
                case "}":
                    if (stringStack.isEmpty()) {
                        return false;
                    } else if (stringStack.peek().equals("{")) {
                        stringStack.pop();
                    } else {
                        return false;
                    }
                    break;
                default:
                    return false;
            }
        }
        return stringStack.isEmpty();
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String s = scanner.nextLine();
            System.out.println(isValid(s));
        }
    }
}

但是提交之后虽然AC成功了但是发现运行速度很慢,然后就看到了一个让我感觉自己很渺小的一个做法,大概思路还是使用栈,但是遍历到 ( 时,入栈 ) ,同理其他两个字符,然后使用pop()方法匹配字符,若出栈字符和遍历到的字符equal,则继续遍历,若不符,则返回false,代码量超级小并且显而易见的运行速度快,代码就不贴了,甘拜下风。

你可能感兴趣的:(LeetCode解答)