问题形容:
给定一个只包含 ‘(‘,’)’,'{‘,’}’,'[‘,’]’ 的字符串 s,判断字符串是否无效。
无效字符串需满足:
左括号必须用雷同类型的右括号闭合。
左括号必须以正确的程序闭合。
思路:
遍历字符串,将左括号入栈,遇到右括号就将栈顶元素出栈,比拟栈顶元素与相应的右括号对应的左括号是否雷同,雷同则将栈顶元素出栈,而后持续循环,当 stack 为空时,也间接返回 false。不雷同则示意不匹配,返回 false。
将右括号作为 hash 表的键,相应的左括号作为值,存储在 map 中。
一、JS 解法
/**
* @param {string} s
* @return {boolean}
*/
const isValid = function (s) {if (s.length % 2 !== 0) {return false}
let map = new Map([[')', '('],
['}', '{'],
[']', '[']
])
const stack = []
const len = s.length
for (let i = 0; i < len; i++) {
// 如果字符在 map 中存在,即作为 map 的键存在,则阐明遍历到的是右括号
// 此时,须要判断其前一个元素(即栈顶的元素)是否是对应的左括号
// 是则将栈顶元素出栈,否则则返回 false,即不匹配
if (map.has(s[i])) {if (!stack.length || stack[stack.length - 1] !== map.get(s[i])) {return false} else {stack.pop()
}
} else { // 如果字符不在 map 中存在,这阐明是左括号,将其入栈即可
stack.push(s[i])
}
}
return !stack.length
}