題目描述
給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 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
}