1、问题描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
2、解题思路:调用栈
思路分析:
遍历字符串中的所有字符
-
如果遇到了左括号,就把对应的右括号压栈(比如遇到了字符‘(’,就把‘)’压栈)
-
如果遇到了右括号,判断栈是否为空:
-
2.1、如果栈为空,说明不能构成有效的括号,直接返回false。
-
2.2、如果栈不为空,栈顶元素出栈,然后判断出栈的这个元素是否等于当前便利的这个右括号,如果不等于说明不匹配,直接返回false,如果匹配就继续遍历下一个字符。
-
-
遍历结束,如果栈为空,说明是完全匹配,即是有效的括号,如果栈不为空,说明不完全匹配,不是有效的括号。
图片来自网络(侵删)
3、代码实现
// 判断是否是有效括号
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
}
}
4、扩展知识
charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。
方法 charCodeAt() 与 charAt() 方法执行的操作相似,只不过前者返回的是位于指定位置的字符的编码,而后者返回的是字符子串。
4.1、charCodeAt 语法
stringObject.charCodeAt(index)
参数 描述
index 必需。表示字符串中某个位置的数字,即字符在字符串中的下标。
charAt() 方法可返回指定位置的字符。
4.2、charAt 语法
stringObject.charAt(index)
参数 描述
index 必需。表示字符串中某个位置的数字,即字符在字符串中的下标
🎈🎈🎈
欢迎掘友们点赞收藏关注转发, 蟹蟹😊