Leetcode之无重复字符的最长字符串
今天的题目主要涉及的是双指针的问题。可能前端同学当听到双指针时可能会有些头皮发麻,难免会想到一些后端知识,其实指针我们也是很常用的。当使用for
循环时,例如循环中的变量i
则就是一个指针,这道题的解法有个洋气的名字叫做 sliding window
, 至于为什么叫这个名字相信会在下面的题解中会得到答案。
题目
给出一个字符串,找出其中不重复字符的最长字符串。
示例 s = "abcabcbb";
输出 3
题解
1、创建所需变量 let set = new Set();
用于存放变量s[i]
;
创建let maxLength = 0;
表示最大不重复字符的数量;
2、需要创建两个指针i
和 j
。最开始i和j都会指向字符串的开头。这时需要用一个for循环去实现将i不断地向前移动。这时需要判断set中是否存在s[i]
,如果没有,说明当前的s[i]
还没有重复的字符,那么将s[i]
添加至set,随之需要更新maxLength
,如果此时set的长度大于maxLength
则更新至最新长度,反之如果小于则不更新。
3、如果set中存在s[i]
,则从set里前面开始删除s[i]
,并且逐次递增j
。再检查set
中是否存在s[i]
,需要一直反复递增j
去检查,直到set
中没有s[i]
为止。
4、重复上述步骤2、3,直到遍历完整个字符串。
代码示例
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
const set = new Set();
let i =0, j = 0, maxLength = 0;
if (s.length === 0) { //如果长度为0,则返回0
return 0;
}
for (i; i < s.length; i++) {
if (!set.has(s[i])) { // 判断set中不存在s[i]
set.add(s[i]); // 向set中添加s[i]
maxLength = Math.max(maxLength, set.size); // 更新maxLength为最大值
} else {
while(set.has(s[i])) { // 只要set中还存在s[i],这个while就不能停
set.delete(s[j]);
j++;
} // 需要重复至set中不存在s[i]为止
set.add(s[i]);
}
}
return maxLength;
};
说一下为啥叫sliding window
,我猜的,我猜的哈!百度翻译为滑动窗口,而我们上述代码中使用while
需要反复判断set中是否还存在s[i]
,我想着就跟那个类似双拉门的窗户,哈哈哈~~
转载自:https://juejin.cn/post/7088228250807173128