一、题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true 示例 3:
输入:s = "(]" 输出:false 示例 4:
输入:s = "([)]" 输出:false 示例 5:
输入:s = "{[]}" 输出:true
二、思路
- 用一个数组模拟栈,遍历字符串,把左括号作为key存在栈中,遇到右括号去栈中找,找到一对key和value配对的就把栈中最后一个数pop出来,最后栈中空了,就是有效字符串
- 可以用数组和map方法解决
三、解法
3.1 解法一 遍历字符串,用数组的方式和模拟栈的方式解题
var isValid = function (s) {
if (!s || s.length % 2 !== 0) return false
let stackArr = []
let keyArr = ['(', '{', '[']
let valueArr = [')', '}', ']']
for (let i = 0; i < s.length; i++) {
if (stackArr.length === 0) {
stackArr.push(s[i])
} else {
let lastAlpha = stackArr[stackArr.length - 1]
let index = valueArr.findIndex(v => v === s[i])
if (index === -1) {
stackArr.push(s[i])
} else {
if (lastAlpha === keyArr[index]) {
stackArr.pop()
} else {
stackArr.push(s[i])
}
}
}
}
return stackArr.length === 0
};
复制代码
3.2 解法二,用map代码更少,更简洁
var isValid2 = function (s) {
if (!s || s.length % 2 !== 0) return false
let stackArr = []
let map = new Map([['(',')'],['{','}'],['[',']']])
for (const ch of s) {
if(map.has(ch)) {
stackArr.push(ch)
} else {
if(map.get(stackArr[stackArr.length -1]) !== ch || stackArr.length === 0) {
return false
} else {
stackArr.pop()
}
}
}
return stackArr.length === 0
};
复制代码
四、提交结果
- 注意第一次没通过,要注意这种情况,"(){}}{"