# 练习

# LeetCode.1.两数之和

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
    let map = new Map()
    for (let i = 0; i < nums.length; i++) {
        let n = nums[i];
        let s = target - n;
        if (map.has(s)) {
            return [map.get(s), i]
        }
        map.set(n, i)
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
    let map = new Map()
    let p = 0;
    let res = 0;
    for (let i = 0; i < s.length; i++) {
        let c = s[i];
        if (map.has(c) && map.get(c) >= p) {
            p = map.get(c) + 1
        }
        map.set(c,i)
        res = Math.max(res, i - p + 1)
    }
    return res
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# LeetCode.76. 最小覆盖子串

/**
 * @param {string} s
 * @param {string} t
 * @return {string}
 */
var minWindow = function (s, t) {
    var l = 0, r = 0, need = new Map();
    for (const c of t) {
        need.set(c, need.get(c) ? need.get(c) + 1 : 1)
    }
    var needType = need.size;
    var res = ""
    while (r < s.length) {
        const c = s[r];
        if (need.has(c)) {
            need.set(c, need.get(c) - 1);
            if (need.get(c) === 0) needType--;
        }
        while (needType === 0) {
            let newRes = s.substring(l, r + 1);
            if (!res || newRes.length < res.length) {
                res = newRes
            }
            const c2 = s[l];
            if (need.has(c2)) {
                need.set(c2, need.get(c2) + 1);
                if (need.get(c2) === 1) {
                    needType++
                }
            }
            l++
        }
        r++
    }
    return res;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36