这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
13. 有效的括号 (valid-parentheses)
标签
- 栈
- map
- 简单
题目
这里不贴题了,leetcode打开就行,题目大意:
括号匹配问题。
相关知识
- Map 与数组的关系
let kvArray = [["key1", "value1"], ["key2", "value2"]];
// 使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象
let myMap = new Map(kvArray);
myMap.get("key1"); // 返回值为 "value1"
// 使用Array.from函数可以将一个Map对象转换成一个二维键值对数组
console.log(Array.from(myMap)); // 输出和kvArray相同的数组
// 更简洁的方法来做如上同样的事情,使用展开运算符
console.log([...myMap]);
// 或者在键或者值的迭代器上使用Array.from,进而得到只含有键或者值的数组
console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]
- Map对象间可以进行合并,但是会保持键的唯一性。
let first = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
let second = new Map([
[1, 'uno'],
[2, 'dos']
]);
// 合并两个Map对象时,如果有重复的键值,则后面的会覆盖前面的。
// 展开运算符本质上是将Map对象转换成数组。
let merged = new Map([...first, ...second]);
console.log(merged.get(1)); // uno
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three
- Map对象也能与数组合并
let first = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
let second = new Map([
[1, 'uno'],
[2, 'dos']
]);
// Map对象同数组进行合并时,如果有重复的键值,则后面的会覆盖前面的。
let merged = new Map([...first, ...second, [1, 'eins']]);
console.log(merged.get(1)); // eins
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three
基本思路
- 遇到左括号就进栈push,
- 遇到右括号并且栈顶为与之对应的左括号,就把栈顶元素出栈。
- 最后看栈里面还有没有其他元素,如果为空,即匹配。
可以用 map 来表示匹配映射。
写法实现
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
// 建立映射关系 map,和栈 stack
let map = new Map([
[')', '('],
[']', '['],
['}', '{'],
]),
stack = []
// 开始遍历字符串
for (i = 0; i < s.length; i++) {
// 当栈的元素超过了字符串的一半,那不可能可以完全匹配了
if (stack.length > s.length / 2) {
return false
}
// 栈顶元素(stack[stack.length - 1]) 不是匹配元素(map.get(s[i])),入栈,匹配就出栈
if (stack.length === 0) {
stack.push(s[i])
} else if (stack[stack.length - 1] !== map.get(s[i])) {
stack.push(s[i])
} else {
stack.pop()
}
}
// 如果最后栈为空说明都匹配完了
return stack.length === 0
};
年初三就来一题吧。
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦
搜索我的微信号infinity_9368,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我
presious tower shock the reiver monster,我看到就通过,暗号对不上不加哈