摘要:无重复字符的最长子串的题目是笔试中比较常见的的题目,难度中等;一般要求都是求得无重复得字符串长度就行,但更难一点就是要求出子串结果;本文算法思想:滑动窗口思想,具体实现要用到双指针+set集合;使用set集合保存子串,两个指针指向字串的前后位置;此外,想要返回结果字符串则需额外两个变量标记最长字串的位置,最后截取最长字串返回结果。
算法思想:
使用i,j双指针标记字串开头和结尾位置,借助set集合存储字串;滑动窗口思想动态更新set集合,以及最长子串的大小max;为了获取最长子串,使用left和right标记最长子串的开始位置和结束位置。最后使用substring(left,right+1)获取结果字符串;
代码:
function getSubString(s){
let max = 0, j = 0;
let set = new Set();
let left = 0, right = 0;
for(let i=0;i<s.length;i++){
if(!set.has(s[i])){
set.add(s[i]);
if(max<set.size){
max = set.size;
left = j;
right = i;
}
}else{
while(set.has(s[i])){
set.delete(s[j]);
j++;
}
set.add(s[i]);
}
}
console.log(max);
// console.log(left);
// console.log(right);
console.log(s.substring(left, right+1));
return max;
}
const s = "abcdafcg"
const s2 = "pwwkew"
getSubString(s);
getSubString(s2);
结果: