這道題感覺挺有意思,之前想了很多種方法,但是都很麻煩 看到一道很巧妙的解法 碼一下~
思路:把前括號([{ 使用 Map 與後括號 映射起來,循環輸入的字符串,如果是前括號,放入棧中,如果是後括號,看是否與棧頂的前括號匹配是一對,如果是,將棧頂元素出棧,繼續向下匹配,直到最後匹配成功,返回true,有一個不能匹配成功,返回false
主要技術:Map、棧
var isValid = function(s) {
if (s.length%2) return false // 奇數不成對 直接返回false
var map = new Map()
map.set('(', ')')
map.set('[',']')
map.set('{','}')
var arr = []
for (var i = 0; i < s.length; i++) {
// 匹配上說明是前括號
if (map.has(s[i])) {
arr.push(s[i])
} else {
// 後括號 與數組最後一項看是否匹配
if (map.get(arr[arr.length - 1]) === s[i]) {
arr.pop() // 匹配上出棧 刪除數組最後一項
} else {
return false
}
}
}
return arr.length === 0 // 最後都匹配上棧爲空
};