跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

精选回复

发布于

原题链接: 题目描述:在字符串s中计算最长无重复的子串 思路一:采用双指针的方法处理,开始和结束指针,结束指针从头往后遍历一遍,遍历的过程中当前这个元素如果在这个子串中,开始指针重新计算(开始指针加上移动的元素个数),没有在这个子串中,重新计算长度,遍历完成后返回长度。

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
          
   
    let len = s.length
    let res = 0
    for (let start = 0, end = 0; end < len; end++) {
          
   
        let index = s.slice(start, end).indexOf(s[end])
        if (index !== -1) {
          
   
        	//index是下标,从0开始的,移动的元素个数为index+1
            start = start + index + 1
        }
        res = Math.max(res, end - start + 1)
    }
    return res
};

思路二:利用数组来存储

let s = abbbc
function longestSubstring(s) {
          
   
    let res = [], max = 0
    for (let i = 0; i < s.length; i++) {
          
   
        let index = res.indexOf(s[i])
        //找到值进行截取
        if (index != -1) {
          
   
            res.splice(0, index + 1)
        }
        res.push(s[i])
        //没找到重新计算长度
        max = Math.max(max, res.length)
    }
    return max
}
console.log(longestSubstring(s))

思路三:利用map查找当前元素是否已经存在,如果存在重新计算开始位置,不存在重新计算长度

var lengthOfLongestSubstring = function(s) {
          
   
    let map = new Map()
    let left = 0, res = 0
    for (let i = 0; i < s.length; i++) {
          
   
        //如果map中存在当前字符,重新计算左侧开始位置的指针
        if (map.has(s[i])) {
          
   
            left = Math.max(map.get(s[i]) + 1, left)
        }
        res = Math.max(res, i - left + 1)
        //key值相同的时候,后面会覆盖前面的
        map.set(s[i], i)
    }
    return res
};

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。