刷 leetcode有效的括号 | 刷题打卡
一、题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
提示:
- 1 <= s.length <= 10^4
- s 仅由括号 '()[]{}' 组成
示例 1: 输入:s = "()" 输出:true
示例 2: 输入:s = "()[]{}" 输出:true
示例 3: 输入:s = "(]" 输出:false
示例 4: 输入:s = "([)]" 输出:false
示例 5: 输入:s = "{[]}" 输出:true
二、思路分析:
其实典型的栈思路。
- 只有括号,所以只有是str长度是奇数肯定就是无效的
- 遍历字符串
- 遇到左括号,就往另一个数组里塞(进栈)
- 遇到右括号,看下是不是对应的数组里的最后一项左括号对应的右括号,是则把数组的最后一项扔出去(出栈)
- 字符串遍历完,数组里只要有,肯定就是无效的,反之则有效
js的一个稍微巧妙的法子:map类型将左括号和右括号一一对应
三、AC 代码:
/** * @param {string} * @return {boolean} */ const isValid = function (s) { if (s.length % 2 === 1) { return false; } const res = []; const map = new Map([ ['[', ']'], ['(', ')'], ['{', '}'], ]); for (const str of s) { const isLeft = map.has(str); if (isLeft || !res.length) res.push(str); else { // 是右边符号的话,看下是不是res最后一个左括号对应的右括号 // 是则删除最后一个,不是则直接返回false if (map.get(res[res.length - 1]) !== str) { return false; } res.pop(); } } return !res.length; };
四、总结:
- 栈思想的运用
- map类型的运用