一、题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 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类型的运用