演算法練習七: 有效的括號
題目:
給定一個只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字串,判斷字串是否有效。
有效字串需滿足:
- 左括號必須用相同型別的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
示例 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刪除完,就說明有不匹配的項。