字典是什么?
与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储。
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. 无重复字符的最长子串
解题思路
先找出所有的不包含重复字符的字串。
找出长度最大的那个字串,返回其长度即可。
- 用双指针维护一个滑动窗口,用来剪切字串
- 不断移动右指针,遇到重复字符,就把左指针移动到重复字符的下一位
- 过程中,记录所有窗口的长度,并返回最大值。
/**
* @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的字串。
找出长度最小的那个字串,返回即可。
- 用双指针维护一个滑动窗口
- 移动右指针,找到包含T的字串,移动左指针,尽量减少包含T的字串的长度。
- 循环上述过程,找出包含T的最小字串。