通过字典 & 双指针滑动窗口实现
- 时间复杂度:O (m + n)
空间复杂度:O (k)
function minWindow(s, t) {let p1 = 0;let p2 = 0;const need = new Map();for (const item of t) {need.set(item, need.get(item) ? need.get(item) + 1 : 1);}let needType = need.size;let res = '';while (p2 < s.length) {const item = s[p2];if (need.has(item)) {need.set(item, need.get(item) - 1);if (need.get(item) === 0) needType--;}while (needType === 0) {const newRes = s.substring(p1, p2 + 1);if (!res || newRes.length < res.length) res = newRes;const item2 = s[p1];if (need.has(item2)) {need.set(item2, need.get(item2) + 1);if (need.get(item2) === 1) needType++;}p1++;}p2++;}return res;}
代码中的第一个循环是遍历了 t 进行了存储操作,所以时间复杂度是O (m),在下面还有一个嵌套循环,但是嵌套的内部循环并不是遍历 s ,所以时间复杂度不算是O (n ^ 2),按整体实现的功能来算是O (n)。
最后总结出来代码的时间复杂度为O (m + n) 其中 m 代表 t 的长度,n 代表 s 的长度。代码中主要存在 need 的集合,用来存储 t 字符串中不重复的字符,所以空间复杂度为O (k) 其中 k 代表字符串 t 中不重复字符的个数。
