1. 程式人生 > >【演算法】LeetCode演算法題-Valid Parentheses

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

此題解法遠不止上面這三種,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!

本文首發於我的個人公眾號:悅樂書,轉載請註明出處!