题目描述
窗口滑动算法
窗口滑动算法是一种常用于解决数组或字符串中连续子序列问题的技术。在无重复字符的最长子串问题中,我们维护一个“窗口”,该窗口内的字符都是唯一的。随着遍历的进行,我们尝试扩展窗口的右边界以包含更多的字符,直到遇到重复字符为止。此时,我们需要移动窗口的左边界,直到窗口内再次变为无重复字符。这个过程中,我们记录并更新遇到的最长子串长度。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let map = new Map(), max = 0
for(let i = 0, j = 0; j < s.length; j++) {
if(map.has(s[j])) {
i = Math.max(map.get(s[j]) + 1, i)
}
max = Math.max(max, j - i + 1)
map.set(s[j], j)
}
return max
};
时间复杂度与空间复杂度
- 时间复杂度:O(n),其中 n 是字符串 s 的长度。因为我们只遍历了字符串 s 一次,并且每个字符最多被访问两次(一次是当它在窗口内时,另一次是更新其在哈希表中的位置时)。
- 空间复杂度:O(min(m, n)),其中 m 是字符集的大小(对于 ASCII 字符集,m = 256),n 是字符串 s 的长度。在最坏的情况下,我们需要存储字符串 s 中的所有不同字符,但这受限于字符集的大小。对于 ASCII 字符串,空间复杂度实际上是 O(1)。