通过字典 & 双指针滑动窗口实现

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

    1. function minWindow(s, t) {
    2. let p1 = 0;
    3. let p2 = 0;
    4. const need = new Map();
    5. for (const item of t) {
    6. need.set(item, need.get(item) ? need.get(item) + 1 : 1);
    7. }
    8. let needType = need.size;
    9. let res = '';
    10. while (p2 < s.length) {
    11. const item = s[p2];
    12. if (need.has(item)) {
    13. need.set(item, need.get(item) - 1);
    14. if (need.get(item) === 0) needType--;
    15. }
    16. while (needType === 0) {
    17. const newRes = s.substring(p1, p2 + 1);
    18. if (!res || newRes.length < res.length) res = newRes;
    19. const item2 = s[p1];
    20. if (need.has(item2)) {
    21. need.set(item2, need.get(item2) + 1);
    22. if (need.get(item2) === 1) needType++;
    23. }
    24. p1++;
    25. }
    26. p2++;
    27. }
    28. return res;
    29. }

代码中的第一个循环是遍历了 t 进行了存储操作,所以时间复杂度是O (m),在下面还有一个嵌套循环,但是嵌套的内部循环并不是遍历 s ,所以时间复杂度不算是O (n ^ 2),按整体实现的功能来算是O (n)

最后总结出来代码的时间复杂度为O (m + n) 其中 m 代表 t 的长度,n 代表 s 的长度。代码中主要存在 need 的集合,用来存储 t 字符串中不重复的字符,所以空间复杂度为O (k) 其中 k 代表字符串 t 中不重复字符的个数。