本月決定學習一下基礎的資料結構,結合 Go 刷刷演算法題目,提升演算法水平的同時複習一下 Go 基礎。
題外話:最近大廠裁員的訊息很多,整個行情非常的低迷,我們要從現在開始準備起來!GO
放低心態、認真學習,機會總是留給不斷努力的自己
題目描述
20.有效的括號
給定一個只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字串 s ,判斷字串是否有效。
有效字串需滿足:
左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一個對應的相同型別的左括號
樣例1
輸入: s = “()”
輸出: true
樣例2
輸入:s = “()[]{}”
輸出:true
樣例3
輸入: s = “(]”
輸出: false
樣例4
輸入:s = “([)]”
輸出:false
樣例5
輸入:s = “{[]}”
輸出:true
提示
- 1 <= s.length <= 104
- s 僅由括號 ‘()[]{}’ 組成
解題思路分析
為什麼要選擇 棧 這個資料結構,我們文末給出。首先先審題一下,這裡有三種不匹配的情況:
第一種情況,字串遍歷過程中,若棧內沒有要匹配的字元,返回 false;
第二種情況,字串遍歷過程中,若棧內已經為空,返回 false;
第三種情況,字串遍歷完成後,但是棧不為空,說明還有未匹配的右括號,返回 false。
字串遍歷完成後,棧內空了,則說明所有的括號全部匹配成功。
分析完之後,程式碼其實就比較好寫了,
AC 提交
其中:
- 時間複雜度:O(N),N 是字串 s 的長度。
- 空間複雜度:O(N),N 是 stack & symbol 佔用的空間。
結果
總結
1、之所以選擇棧,是因為棧結構的特殊性,當某個資料集合只涉及在某端插入和刪除資料,且滿足後進者先出,先進者後出的操作特性時(LIFO),我們應該首選棧這種資料結構,非常合適做對稱匹配類。
// push
stack = append(stack, s)
// pop
stack = stack[:len(stack)-1]
2、寫程式碼之前應該先分析不匹配題目的異常情況,切記直接擼程式碼實現。分析題目在演算法題解答中非常重要!
最後
感謝閱讀,歡迎關注,後面會持續更新的。
本作品採用《CC 協議》,轉載必須註明作者和本文連結