Skip to content

LeetCode: 20-Valid Parentheses 解題紀錄

Last Updated on 2022-03-13 by Clay

題目

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

An input string is valid if:

Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.

Example:

Input: s = "()[]{}"
Output: true

Input: s = "([)]"
Output: false

Input: s = "{[]}"
Output: true

題目會給輸入一個字串,該字串只會由以下符號組成:

  • (
  • )
  • [
  • ]
  • {
  • }

而我們要判斷這些括弧的組合是否『合法』,左方符號一定要對應右方符號,符號的中間可以放入合法符號。詳情請參考上方的範例。


解題思路

這題是使用 stack 解題的經典範例。我們只要碰到 ({[ 就將其放入 stack 中,如果遇到 )}] 則匹配 stack 的最頂部(stack 是後進先出的資料結構),如果是合法的匹配,則將其 stack 頂部的字符彈出。

如果 stack 為空,而又碰到了需要匹配 )}] 的情況,則意味著這是個不合法的字串,直接回傳 false。如果匹配到最後 stack 為空,回傳 true、反之則 false。

用文字有些難以說明,我們假設現在題目的輸入是 " { [ ( ) ] }" 這樣的字串。

步驟陣列解釋
1{只有一個字元,不需計算是否合法
2{ [放入
3{ [ (持續放入
4{ [ ( )合法,彈出 (
5{ [ ]合法,彈出 [
6{ }合法,彈出 {
7字串輸入完畢,陣列為空,返回 true


C++ 程式碼

class Solution {
public:    
    bool isValid(string s) {
        // Init
        stack<char> st;
        
        // Matching
        for (char c: s) {            
            if (c == '(' || c == '{' || c == '[') {
                st.push(c);
            }
            else if (st.empty()) {
                return false;
            }            
            else if (st.top() == '(' && c != ')') return false;
            else if (st.top() == '{' && c != '}') return false;
            else if (st.top() == '[' && c != ']') return false;
            
            // Pop
            else st.pop();
        }
        
        return (st.empty());
    }
};


Python 程式碼

class Solution:
    def isValid(self, s: str) -> bool:
        # Init
        st = []
        
        # Matching
        for c in s:
            if c in ['(', '{', '[']:
                st.append(c)
            elif len(st) == 0: return False
            elif st[-1] == '(' and c != ')': return False
            elif st[-1] == '{' and c != '}': return False
            elif st[-1] == '[' and c != ']': return False
            else: st.pop()
        
        return len(st) == 0
            



References

Leave a Reply