Leetcode之无重复字符的最长字符串

今天的题目主要涉及的是双指针的问题。可能前端同学当听到双指针时可能会有些头皮发麻,难免会想到一些后端知识,其实指针我们也是很常用的。当使用for循环时,例如循环中的变量i则就是一个指针,这道题的解法有个洋气的名字叫做 sliding window, 至于为什么叫这个名字相信会在下面的题解中会得到答案。

题目

给出一个字符串,找出其中不重复字符的最长字符串。

示例 s = "abcabcbb";
输出 3 

题解

image.png

1、创建所需变量 let set = new Set();用于存放变量s[i]

创建let maxLength = 0; 表示最大不重复字符的数量;

2、需要创建两个指针ij。最开始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],我想着就跟那个类似双拉门的窗户,哈哈哈~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值