有效的括号
- https://leetcode.cn/problems/valid-parentheses/
描述
-
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
-
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
提示:
- 1 <= s.length <= 1 0 4 10^4 104
- s 仅由括号 ‘()[]{}’ 组成
算法实现
1 )方案 1文章来源:https://www.toymoban.com/news/detail-429188.html
function isValid(s: string): boolean {
// 奇数直接不合法
if (s.length % 2 === 1) {
return false;
}
const stack = [];
const leftArr = ['(', '{', '[']
for(let i = 0; i < s.length; i ++) {
// 拿出当前字符
const c = s[i];
// 是左括号进栈
if(leftArr.includes(c)) {
stack.push(c);
} else {
// else 是右括号的情况,拿出栈顶元素(数组最后一位)
const t = stack[stack.length - 1];
// 对比栈顶元素和当前元素是否匹配
const isMatch = (t === '(' && c === ')') || (t === '{' && c === '}') || (t === '[' && c === ']')
if(isMatch) {
// 将栈顶元素出栈
stack.pop();
} else {
// 不匹配,直接退出
return false;
}
}
}
// 字符串扫描完成, 栈应该为空,不为空则false
return stack.length === 0;
};
- 解题思路
- 对于没有闭合的左括号而言,越靠后的左括号,对应的右括号越靠前, 如 {[]}
- 满足后进先出,可考虑用栈
- 新建一个栈
- 扫描字符串,遇左括号入栈,遇和栈顶括号类型匹配的右括号就出栈,类型不匹配直接判定为不合法
- 字符串扫描完了,栈是空的就合法,否则不合法
2 )方案 2文章来源地址https://www.toymoban.com/news/detail-429188.html
function isValid(s: string): boolean {
// 奇数直接不合法
if (s.length % 2 === 1) {
return false;
}
const stack = [];
// 用字典存储 这种方式缺点是空间复杂度较高
const map = new Map([
['(', ')'],
['{', '}'],
['[', ']']
])
/*
// 这种方式是写起来繁琐
const map = new Map()
map.set('(', ')');
map.set('{', '}');
map.set('[', ']');
*/
for(let i = 0; i < s.length; i++) {
// 拿出当前字符
const c = s[i];
// 是左括号进栈
if(map.has(c)) {
stack.push(c);
} else {
// else 是右括号的情况
// 拿出栈顶元素(数组最后一位)
const t = stack[stack.length - 1];
// 对比栈顶元素和当前元素是否匹配
// 左括号===当前元素
if(map.get(t) === c) {
// 将栈顶元素出栈
stack.pop();
} else {
return false;
}
}
}
// 字符串扫描完成, 栈应该为空,不为空则false
return stack.length === 0;
}
- 基于Map这个数据结构,优化了程序的判断方式
到了这里,关于数据结构与算法之字符串: Leetcode 20. 有效的括号 (Typescript版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!