无重复字符的最长子串

177 阅读1分钟

无重复字符的最长子串

示例:

  • 输入: s = "abcabcbb"
  • 输出: 3
  • 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 思考:怎么去判断是否有重复?怎么取最长length

答案:

  • 判断是否有重复可以使用循环原字符串,通过一个新的数据结构来存储新的数据,用新的数据来判断是否has当前循环到的数据,中止条件has == true
  • 怎么取最长呢?Math.max(oldLen,newLen) 用什么数据结构来存储新数据合适呢? 我们需要有当前的值和下标

结论:那我们可以使用map来存储,当然其他方式也可以。 代码实现:

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    // 思路:左指针,右指针,长度之差加1
    let left = 0
    let res = 0
    let length = s.length
    // 存放值和下标
    let map = new Map()
    // 循环字符串
    for (let r=0;r<length;r++) {
        if (map.has(s[r])&&map.get(s[r])>=left) {
            left = map.get(s[r])+1
        }
        map.set(s[r],r)
        res = Math.max(res, r-left+1)
    }
    return res
};

巧妙之处:用左指针,右指针来判断长度,当找到一个相同的字符的时候,我们需要把之前相同的这个字符delete,那我们可以通过移动左指针来实现,往后移动一位。 leedcode每日一题,坚持就是胜利。✌️