1. 程式人生 > 其它 >20 有效的括號(LeetCode HOT 100)

20 有效的括號(LeetCode HOT 100)

描述:
給定一個只包括 '(',')','{','}','[',']' 的字串 s ,判斷字串是否有效。

有效字串需滿足:

左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。

示例 1:

輸入:s = "()"
輸出:true

示例 2:

輸入:s = "()[]{}"
輸出:true

示例 3:

輸入:s = "(]"
輸出:false

示例 4:

輸入:s = "([)]"
輸出:false

示例 5:

輸入:s = "{[]}"
輸出:true

示例 6:

輸入:s = "}"
輸出:false

提示:
1 <= s.length <= 104
s 僅由括號 '()[]{}' 組成

Soulution:

public class L20IsValid {
    public static void main(String[] args) {
        String s = "()";
        // true
        System.out.println(isValid(s));
        s = "()[]{}";
        // true
        System.out.println(isValid(s));
        s = "(]";
        // false
        System.out.println(isValid(s));
        s = "([)]";
        // false
        System.out.println(isValid(s));
        s = "{[]}";
        // true
        System.out.println(isValid(s));
        s = "}";
        // true
        System.out.println(isValid(s));
    }


    /**
     * 儲存括號對應關係
     */
    static HashMap<Character, Character> bracketMap = new HashMap<Character, Character>() {{
        put(')', '(');
        put(']', '[');
        put('}', '{');
    }};

    public static boolean isValid(String s) {
        Stack<Character> waitMatchStack = new Stack<>();
        char[] chars = s.toCharArray();
        for (char aChar : chars) {
            if (bracketMap.containsKey(aChar)) {
                if (waitMatchStack.isEmpty()) {
                    return false;
                } else if (!bracketMap.get(aChar).equals(waitMatchStack.pop())) {
                    return false;
                }
            } else {
                waitMatchStack.push(aChar);
            }
        }
        return waitMatchStack.isEmpty();
    }
}

Idea:
括號匹配,自然而然想到用棧解決。
不過要注意棧空的情況。

Reslut: