双指针(或叫做长度改变的滑动窗口)+ 哈希表
根据左右指针的移动来找到最长子字符串
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
const lens=s.length;
//若字符串为空字符串,则返回0
if(lens==0){
return 0;
}
const arr=new Array(256).fill(0);//子字符串的各字符对应的哈希表(初始化)
//ASCII 码使用指定的7 位或8 位二进制数组合来表示128(标准) 或256(扩展) 种可能的字符
let i=0,j=0;//i左指针,j右指针
let maxSubLength=1;//不含重复字符发最长字符串的初始长度
for(;j<lens;j++){
// 如果该处字母在已有的子字符串的哈希表中出现次数大于0,则将i处数字删除且i指针加1
while(arr[s.charCodeAt(j)]>0){
arr[s.charCodeAt(i)]--;
i++;
}
//更新长度
maxSubLength=Math.max(maxSubLength,j-i+1);
arr[s.charCodeAt(j)]++;//在哈希表中记录当前字符,然后移动右指针
}
return maxSubLength;
};
时间复杂度o(n)