leetcode 3. 无重复字符的最长子串

74 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

3. 无重复字符的最长子串

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

示例 1:

输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

思路分析:

本题需要我们找到没有重复字符的最长子串,首先我们分析,找子串会使用循环遍历的方式把整个字符串遍历一遍,然后还要剔除中间重复的,那我们是不是可以通过一个对象来保存当前已经收集了的字符串,如果再遇到对象里面有的字符串,就说明当前收集的字符串已经到了极限了。

        if(obj.has(item)){
            //删除字符直到重复字符
            for(let key of obj.keys()){
                if(key === item){
                    obj.delete(item)
                    break
                }
                obj.delete(key)
            }
            //加入当前字符
            obj.set(item,true)
        }else{
            //向对象中加入新字符
            obj.set(item,true)            
        }

这个思路下来,可以想到滑动窗口的办法,我们创建对象,然后收集字符串,不停的向右增加滑动窗口内容,然后在遇到已有的字符时,我们开始滑动窗口的左端,收缩窗口的长度,直到重复的字符被移除,并且在收缩左端窗口之前,先记录当前保存长度,与历史长度相比是否更长。最后当我们完成了对字符串的整体遍历之后,得出的保留长度就是我们得到的最长长度

代码实现:

var lengthOfLongestSubstring = function(s) {
    //记录当前保存字符
    let obj = new Map()
    //记录当前最长长度
    let length = 0
    for(let item of s){
        if(obj.has(item)){
            //删除字符直到重复字符
            for(let key of obj.keys()){
                if(key === item){
                    obj.delete(item)
                    break
                }
                obj.delete(key)
            }
            //加入当前字符
            obj.set(item,true)
        }else{
            //向对象中加入新字符
            obj.set(item,true)
            // console.log(obj.size)
            
        }
        length = obj.size>length?obj.size:length
    }
    return length
};