1. 程式人生 > >演算法練習七: 有效的括號

演算法練習七: 有效的括號

題目:

給定一個只包括 '('')''{''}''['']' 的字串,判斷字串是否有效。

有效字串需滿足:

  1. 左括號必須用相同型別的右括號閉合。
  2. 左括號必須以正確的順序閉合。

注意空字串可被認為是有效字串。

示例 1:

輸入: "()"
輸出: true

示例 2:

輸入: "()[]{}"
輸出: true

示例 3:

輸入: "(]"
輸出: false

示例 4:

輸入: "([)]"
輸出: false

示例 5:

輸入: "{[]}"
輸出:
true

解答:

    <script type="text/javascript">
        var isValid = function(s) {
            let save = []
            for(let i = 0; i < s.length; i++) {
                if(s[i] == "(") {
                    save.push(')')
                } else if(s[i] == '{') {
                    save.push('}')
                } else if(s[i] == '[') {
                    save.push(']')
                } else if(save.pop() != s[i]) {
                    return false
                }
            }
            return !save.length
        }
        console.log(isValid('({[]})'))
    </script>

解析:

該題使用到堆疊的棧記憶體的先進後出的特點,所謂入棧就是將元素壓入(push)棧中,出棧就是將元素彈出(pop)棧中,先入棧的一定後出,就像一個只允許一個物體同時進入的木桶一樣。

首先我們建立一個空陣列save,然後遍歷傳入進來的括號字串。如果遍歷到不同型別的左括號,那麼就往save中push進對應的右括號。如果遇到不是左括號的,就彈出陣列中最後一項與之對比,如果相同則繼續,不同就返回false。當我們遍歷完,如果沒有將陣列中的項通過pop刪除完,就說明有不匹配的項。