前端算法面试必刷题系列[7]

294 阅读2分钟

这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。

13. 有效的括号 (valid-parentheses)

标签

  • map
  • 简单

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

括号匹配问题。

相关知识

  1. 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"]
  1. 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
  1. 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

基本思路

  1. 遇到左括号就进栈push,
  2. 遇到右括号并且栈顶为与之对应的左括号,就把栈顶元素出栈。
  3. 最后看栈里面还有没有其他元素,如果为空,即匹配。

可以用 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,我看到就通过,暗号对不上不加哈

参考