1. 程式人生 > >【LeetCode】20 Valid Parentheses 有效括號

【LeetCode】20 Valid Parentheses 有效括號

給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。
有效字串需滿足:
左括號必須用相同型別的右括號閉合。 左括號必須以正確的順序閉合。 注意空字串可被認為是有效字串。
示例 1:
輸入: “()” 輸出: true
示例 2:
輸入: “()[]{}” 輸出: true
示例 3:
輸入: “(]” 輸出: false
示例 4:
輸入: “([)]” 輸出: false
示例 5:
輸入: “{[]}” 輸出: true


思路:
思路很簡單,利用棧,通過率也很高,重點是如何進行優化
具體思路:
遍歷字串,如果是左括號就push,是右括號就檢測:棧空或pop出來的字元不是對應左括號則return false。遍歷結束判斷棧是否為空,不為空則return false,否則return true

Stack不支援char等基本型別,所以可以選擇用String判斷或者用Character判斷
結果:用String的話耗時14ms,用Character耗時7~9ms
還有一種優化方法是將Stack用char陣列實現,能到5ms左右

另外 String轉成char有兩種方法:
1 String.charAt(i)
2 String.toCharArray()
char轉成String:
1 String.valueOf(‘字元’)
2 Character.toString(‘字元’)
3 “” + ‘字元’【效率很低】

用Character的程式碼:

class Solution {
    public boolean isValid(String s) {
        boolean valid = true;
        if (s == "")
            return valid;
        Stack<Character> stack = new Stack<>();
        
        for (int i = 0;i < s.length();i++){
            char c = s.charAt(i);
            if (c == '(' || c == '{' || c == '['){
                stack.push(c);
                continue;
            }
            if (c == ')'){
                if (stack.empty() || !(stack.pop() == '(')){
                    valid = false;
                    return valid;
                }
            }
            if (c == '}'){
                if (stack.empty() || !(stack.pop() == '{')){
                    valid = false;
                    return valid;
                }
            }
            if (c == ']'){
                if (stack.empty() || !(stack.pop() == '[')){
                    valid = false;
                    return valid;
                }
            }
        }
        if (!stack.empty())
            valid = false;
        System.out.println(stack);
        return valid;
        
    }
}