给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false解题思路:调用栈
思路分析:
遍历字符串中的所有字符如果遇到了左括号,就把对应的右括号压栈(比如遇到了字符‘(’,就把‘)’压栈)
- 如果遇到了右括号,判断栈是否为空:
- 2.1、如果栈为空,说明不能构成有效的括号,直接返回false。
- 2.2、如果栈不为空,栈顶元素出栈,然后判断出栈的这个元素是否等于当前便利的这个右括号,如果不等于说明不匹配,直接返回false,如果匹配就继续遍历下一个字符。
- 遍历结束,如果栈为空,说明是完全匹配,即是有效的括号,如果栈不为空,说明不完全匹配,不是有效的括号。
看代码
// 判断是否是有效括号
export const isAvailableBrackets = (str) => {
let stack = [] // 定义栈
// 定义括号集
const brackets = {
'(': ')',
'[': ']',
'{': '}'
}
const leftBrackets = Object.keys(brackets)
const rightBrackets = Object.values(brackets)
for (let i = 0; i < str.length; i++) {
// 1.如果是左括号,把对应的右括号压栈
// 2.如果是右括号,判断栈是否为空,元素出栈比对
if (leftBrackets.includes(str.charAt(i))) {
stack.push(brackets[str.charAt(i)])
} else if (rightBrackets.includes(str.charAt(i))) {
if (stack.length === 0) {
return false
} else {
let stackTop = stack.pop() // 栈顶元素出栈
if (stackTop === str.charAt(i)) {
continue
} else {
return false
}
}
}
}
// 3.遍历结束之后,判断栈是否为空
if (stack.length === 0) {
return true
} else {
return false
}
}
扩展知识
charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。
方法 charCodeAt() 与 charAt() 方法执行的操作相似,只不过前者返回的是位于指定位置的字符的编码,而后者返回的是字符子串。
语法
stringObject.charCodeAt(index)
参数 描述
index 必需。表示字符串中某个位置的数字,即字符在字符串中的下标。
charAt() 方法可返回指定位置的字符。
语法
stringObject.charAt(index)
参数 描述
index 必需。表示字符串中某个位置的数字,即字符在字符串中的下标