(七)数据结构之“字典”

125 阅读2分钟

字典是什么?

与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储。

ES6 中有字典,Map。

字典的常用操作:键值对的增删改查。

const m = new Map()
// 增
m.set('a', 'aaa')

// 删
m.delete('a')
m.clear()

// 改
m.set('a', 'accc')

// 查
m.get('a)

LeetCode:349. 两个数组的交集

349. 两个数组的交集 - 力扣(LeetCode) (leetcode-cn.com)

题解

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    const oM = new Map()
    nums1.forEach(m => oM[m] = true) // 长度m

    const arr = []
    nums2.forEach(n => { // 长度n
        oM[n] && !arr.includes(n) && arr.push(n)
    })
    return arr
};

复杂度

  • 时间复杂度:O(m + n)

  • 空间复杂度:O(m)

LeetCode:3. 无重复字符的最长子串

解题思路

先找出所有的不包含重复字符的字串。

找出长度最大的那个字串,返回其长度即可。

  1. 用双指针维护一个滑动窗口,用来剪切字串
  2. 不断移动右指针,遇到重复字符,就把左指针移动到重复字符的下一位
  3. 过程中,记录所有窗口的长度,并返回最大值。
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let l = 0
    let len = 0
    // 记录滑动窗口的数据
    let oM = new Map()
    for(let r = 0; r < s.length; r++) {
        // 右指针在滑动窗口中有数据
        if (oM.has(s[r]) && oM.get(s[r]) >= l) {
            l = oM.get(s[r]) + 1
        }
        // 返回窗口的最大值
        len = Math.max(r - l + 1, len)
        oM.set(s[r], r)
    }
    return len
};

复杂度

  • 时间复杂度:O(n),n 是字符串的长度

  • 空间复杂度:O(m),m 是字符串中不重复字符的个数

LeetCode:76. 最小覆盖子串

76. 最小覆盖子串 - 力扣(LeetCode) (leetcode-cn.com)

解题思路

先找出所有的包含T的字串。

找出长度最小的那个字串,返回即可。

  1. 用双指针维护一个滑动窗口
  2. 移动右指针,找到包含T的字串,移动左指针,尽量减少包含T的字串的长度。
  3. 循环上述过程,找出包含T的最小字串。