[Go 演算法]20:有效括號(棧)

one_day發表於2022-09-21

本月決定學習一下基礎的資料結構,結合 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 協議》,轉載必須註明作者和本文連結

相關文章