给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

  1. 用双指针维护一个滑动窗口,用来剪切子串。
  2. 不断移动右指针,直到遇到重复字符的时候把左指针移到前面的重复字符的下一位。(相当于把前面的重复字符删除)
  3. 移动指针过程中,记录窗口长度的最大值即为答案。
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    // 定义一个左指针
    let left=0 
    // 定义一个结果
    let res=0
    // 存放字符和下标
    let map=new Map()
    for(let i=0;i<s.length;i++){
        // 判断是否出现重复字符串,进入判断的重复的字符串必须是位于左指针的右边
        if(map.has(s[i]) && map.get(s[i])>=left){
            // 左指针移到重复出现的字符串的下一位
            left=map.get(s[i])+1
        }
        res=Math.max(res,i-left+1)
        // 存下每个字符的下标
        map.set(s[i],i)
    }
    return res
};

在判断是否是重复字符的时候,别忘了加上 满足重复字符的索引大于左指针(&& map.get(s[r]) >= left) 这个附加条件,不然就会出错。比如 abbcdea这个 意外,在遍历到最后一个字符 a 的时候,如果没有加上这个条件,最后一个 a 也会被认为是重复字符,从而产生错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值