这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战
题目描述
给一个字符串,里面只包含(,),{,},[,]这六种字符,然后需要你判断字符串是否是有效的括号,也就是是否以同种类型按照顺序闭合的。
如果是,则返回true, 否则返回false。
举个例子:
字符串: '[]'
返回: true
字符串: '[)]'
返回: false
字符串: '([)]'
返回: false
字符串: '[()]'
返回: true
字符串: '(){}[]'
返回: true
字符串: '[{}]()'
返回: true
思路分析
这道题起码有三种类型:
- 嵌套闭合的
[()] - 同级闭合的
[]{} - 嵌套和同级组合闭合的
[{}]()
所以有很多种情况需要考虑。 之前我写的只是考虑的嵌套闭合这种情况,所以提交的时候会报错。然后我又加上同级闭合的情况,以为会成功了。但是还有嵌套和同级组合闭合的情况。
附上只考虑嵌套闭合和同级闭合的情况,没有考虑组合闭合的代码:
var isValid = function (s) {
const mapping = {
'(': ')',
'{': '}',
'[': ']'
}
if (s.length % 2 === 1) return false
const len = s.length
if (mapping[s[0]] === s[1]) {
for (let i = 0; i <= len - 2; i = i + 2) {
const s1 = mapping[s[i]]
console.log(i, s[i], s1)
if (s1) {
if (s1 !== s[i + 1]) {
return false
}
} else {
return false
}
}
} else {
for (let i = 0; i < len / 2; i++) {
const s1 = mapping[s[i]]
console.log(s1)
if (s1) {
if (s1 !== s[len - i - 1]) {
return false
}
} else {
return false
}
}
}
return true
};
针对上面的问题,因为各个情况有点多,有点考虑不过来,所以得换个思路去解决问题。
我们分析它们的规律可以得到,从内部去掉闭合的字符串,下一对肯定也是闭合的字符串,直至最外层。
如果不是,则证明不是有效的括号。
我们可以使用对象来存储映射关系,左括号为key,右括号为value,
另外再用一个新数组来存储右括号。
遍历字符串,通过对象来判断是不是左括号,如果是,则把对应的右括号存到数组中。否则,则证明是当前是右括号,需要判断数组最后一个值是不是和它相等。
如果不相等,则证明不是有效的括号。
如果相等,则把数组最后一个值删除,继续遍历。
遍历结束后,如果是有效的括号则数组的长度应该是0。如果大于0则证明是未闭合的。
代码如下:
var isValid = function (s) {
if (s.length % 2 === 1) return false
const mapping = {
'(': ')',
'{': '}',
'[': ']'
}
const arr = []
for (let i = 0; i < s.length; i++) {
if (mapping[s[i]]) {
arr.push(mapping[s[i]])
} else {
if (!arr.length || arr[arr.length - 1] !== s[i]) {
return false
}
arr.pop()
}
}
console.log(arr)
return arr.length === 0
};