LeetCode20——有效的括號

題目描述

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

有效字符串需滿足:

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

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

示例 1:

輸入: "()"
輸出: true

示例 2:

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

示例 3:

輸入: "(]"
輸出: false

示例 4:

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

示例 5:

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

分析

本題需要利用 數據結構先進後出的特點。如果遇到左括號則push入棧中,如果遇到右括號,則需要從棧中pop出一個與之匹配的左括號,否則該字符串不合法。

全部判斷完後,該棧需要爲空,不爲空則表示該字符串不合法。

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    const stack = []
    const paren_map = {')': '(', ']': '[', '}': '{'}
    for (let i of s) {
        if (!(i in paren_map)) 
            stack.push(i)
        else if (stack.length === 0 || stack.pop() !== paren_map[i]) 
            return false
    }
    return stack.length === 0
}

時間複雜度: O(n)
空間複雜度: O(n)

開心消消樂解法

在LeetCode上還看到一種有趣的解法,把兩兩匹配的括號全部消掉,直到沒有兩兩匹配的括號爲止,如果字符串爲空則爲true

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    let length
    do {
        length = s.length
        s = s.replace("()", "").replace("[]", "").replace("{}", "")
    } while(length !== s.length)
    return s.length === 0
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章