Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目分析
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
思路讲解
- 给定一个只包括 '(', ')', '{', '}', '[', ']' 的字符串 s , 判断字符串是否有效。
有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
- 遍历给字符串s。 当遇到一个左括号,希望在后面的字符中,有一个相同类型的右括号将其闭合。
- 当遇到一个右括号时,就可以去出栈顶的左括号,判断两个括号是否能闭合。
如果不是相同类型的括号或者栈中没有括号,我们这个字符串就是无效的。 - 为了能快速的判断括号的类型,我们可以创建一个Map。 创建一个栈
stack来存储我们的左括号。 - 最后开始遍历我们的字符串
- 如果是左括号,我们就将该字符加入到栈中
- 如果是右括号,判断栈顶的元素和当前的元素是否能完全闭合
示例
输入: s = "()"
输出: true
输入: s = "()[]{}"
输出: true
输入: s = "([)]"
输出: false
输入: s = "{[]}"
输出: true
代码
/*
* @lc app=leetcode.cn id=20 lang=javascript
*
* [20] 有效的括号
*/
// @lc code=start
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
// 定义一个栈
let stack = []
// 使用map设置好映射关系
let map = new Map([
[')', '('],
[']', '['],
['}', '{']
])
// 遍历s
for (ch of s) {
if (map.has(ch)) {
// 如果包含
// 需要判断栈是否空了, 或者从map中取出的映射值不等于栈顶元素, return false
if (!stack.length || map.get(ch) !== stack[stack.length - 1]) {
return false
}
// 否组表示配对成功,需要把栈顶元素弹出
stack.pop()
} else {
stack.push(ch) // 如果不包含,就存到栈里
}
}
return !stack.length // 如果stack为空,表示所有元素都弹出了,都匹配上了
};
// @lc code=end