20、有效的括号
js
;(function () {
/**
* 20. 有效的括号
* 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
*
* 有效字符串需满足:
* 左括号必须用相同类型的右括号闭合。
* 左括号必须以正确的顺序闭合。
*
* 输入:s = "()"
* 输出:true
*
* 输入:s = "()[]{}"
* 输出:true
*
* 输入:s = "(]"
* 输出:false
*
* 输入:s = "([)]"
* 输出:false
*
* 输入:s = "{[]}"
* 输出:true
*
*/
// // 定义obj接口类型
// interface obj {
// [keyName: string]: string
// }
// let obj: obj = {
// '(': ')',
// '{': '}',
// '[': ']'
// }
function isValid(s: string): boolean {
// 方法一
// // 1. 字符长度必须是双数
// if (s.length % 2 !== 0) {
// return false
// }
// // 2. 遍历:肯定有单个成对的 '()' '{}' '[]'的出现,将其成对剔除出去,如果最后字符串变成空,则true
// let reg = /(\(\))|(\{\})|(\[\])/;
// while(reg.test(s)){
// s = s.replace(/(\(\))|(\{\})|(\[\])/g, '')
// }
// return s.length === 0 || false
// 方法二:栈(官方标准做法)
interface obj {
[keyName: string]: string;
}
let obj: obj = {
// start: end
'(': ')',
'{': '}',
'[': ']'
}
if (s.length % 2 !== 0) {
return false
}
let stack: string[] = []
for (let i of s) {
// 如果start 和 i(end)对应上了,则pop,否则push
if (stack.length > 0) {
// obj[stack[stack.length - 1]]: stack[stack.length - 1]栈顶元素, obj[栈顶元素] --> 判断是否是start中的一个
i === obj[stack[stack.length - 1]] ? stack.pop() : stack.push(i)
} else {
stack.push(i)
}
}
return !stack.length
}
let s0 = '()]'
let s1 = '()'
let s2 = '()[]{}'
let s3 = '(]'
let s4 = '([)]'
let s5 = '{[]}'
// console.log(isValid(s0))
// console.log(isValid(s1))
// console.log(isValid(s2))
// console.log(isValid(s3))
// console.log(isValid(s4))
console.log(isValid(s5))
})()