题目简介
一串包含(
、)
、{
、}
、[
、]
的字符串,需要判断该字符串是否有效,遵循以下两个条件:
- Open brackets must be closed by the same type of brackets.(开符号必须被同类型的闭符号关闭)
- Open brackets must be closed in the correct order.(开符号必须以正确的顺序关闭)
例子
Input: s = "([)]"
Output: false
Input: s = "{[]}"
Output: true
思考
将(
、)
、{
、}
、[
、]
以键值对的形式存入Map
内,遍历字符串s
,若遇到开符号则将其推送到数组stack
内,否则则将符号(闭符号)弹出,与Map
内的值相比,若不等,则返回false
,循环结束后,若数组stack
为空,则返回true
,否则返回false
,例如字符串若为((()
,循环结束后,stack
一定不为空。
代码如下所示:
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const len = s.length
if (!len) return true
let flag = true
const stack = []
const mapping = new Map([
[")", "("],
["}", "{"],
["]", "["]
])
for (let i = 0; i < len; i++) {
let char = s[i]
let val = mapping.get(char)
// 查看是否为结束符号
if (!!val) {
let topChar = ''
if (stack.length) topChar = stack.shift()
if (val !== topChar) {
flag = false
break;
}
} else {
// 若为开始符号,则将该字符放在数组最前面
stack.unshift(char)
}
}
if (stack.length) flag = false
return flag
};
亦可将上面的shift
、unshift
换成pop
、push
,遵循stack
原则:始终从同一入口增加/减少元素