leetcode-栈-[20] 有效的括号
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例
示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true示例 3:输入:s = "(]"输出:false示例 4:输入:s = "([)]"输出:false示例 5:输入:s = "{[]}"输出:true
提示:
- 1 <= s.length <= 104
- s 仅由括号 ‘()[]{}’ 组成
解题思路
利用栈的先进后出规则
- 申明一个数组缓存符号状态
- 对字符串进行循环
- 出现左括号进行入栈操作
- 出现右括号进行出栈操作,拿到栈顶元素进行匹配,不匹配返回false,匹配继续进行循环
- 循环结束最后判断缓存数组是否有值,有值说明符号不是成对存在的返回false
说明:
- const len = s.length; 可以提高性能减少计算次数, 2.if (len % 2) return false;判断字符串是否为偶数项,减少不必要的计算
// 题解一 常规解题思路,便于理解/*** @param {string} s* @return {boolean}*/var isValid = function (s) {let arr = [];const len = s.length;if (len % 2) return false;for (var i = 0; i < len; i++) {switch (s[i]) {case '(':case '[':case '{':arr.push(s[i]);break;case ')':if (arr.pop() !== '(') return false;break;case ']':if (arr.pop() !== '[') return false;break;case '}':if (arr.pop() !== '{') return false;break;}}return !arr.length;};
// 题解二 使用Map键值对存储,优化代码逻辑/*** @param {string} s* @return {boolean}*/var isValid = function (s) {let arr = [];let len = s.length;const map = new Map();map.set('(', ')');map.set('[', ']');map.set('{', '}');if (len % 2) return false;for (var i = 0; i < len; i++) {if (map.has(s[i])) {arr.push(s[i]);} else {if (!arr.length) {return false;}if (map.get(arr.pop()) !== s[i]) {return false;}}}return !arr.length;};
