寻找字符串的最长字串:
使用滑动窗口的思想,在只需要遍历一次字符串的情况下,利用滑动窗口找出最长的子串
滑动窗口?
其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!
如何移动?
我们只要把队列的左边的元素移出就行了,直到满足题目要求!
一直维持这样的队列,找出队列出现最长的长度时候,求出解!
时间复杂度O(n)空间复杂度O(m)
var lengthOfLongestSubstring = function(s) {
//右指针
let rk = 0
//子串的最大长度
let ans = 0
let result = ''
let n = s.length
//滑动窗口
let occ = new Set()
//对字符串进行遍历
for(let i=0;i<n;i++){
if(i!==0){
//左指针在每次遍历的时候都自动向右移动一个
occ.delete(s.charAt(i-1))
}
//如果不重复就加入滑动窗口
while(rk<n&&!occ.has(s.charAt(rk))){
occ.add(s.charAt(rk))
rk++
}
//直到有重复才跳出循环,获取最大的ans
result = occ.size>ans?Array.from(occ).join(''):result
ans = Math.max(ans,occ.size)
}
return result
};
lengthOfLongestSubstring('abcabcbb')