LeetCode无重复字符的最长子串使用JavaScript解题|前端学算法

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

有人相爱,有人夜里开车看海,我是leetcode第一题都做不出来

前几天做LeetCode算法题,我还说要打十个,今天就被LeetCode狠狠打脸了

算了,难度大的做不出来,咱还做不出来简单的嘛,今天咱们就捡软柿子捏,来找找自信,昨天找了一下自信,我怕自信不够大,今天再找找

无重复最长子字符串

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

示例 1:

输入: s = "abcabcbb"

输出: 3

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

示例 2:

输入: s = "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。   请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解题思路

听说这总方法叫 滑动窗口

依次递增地枚举子串的起始位置,那么子串的结束位置也是递增的!这里的原因在于,假设我们选择字符串中的第 k 个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为 r k r_k 。那么当我们选择第 k+1 个字符作为起始位置时,首先从 k+1 到 r k r_k 的字符显然是不重复的,并且由于少了原本的第 k 个字符,我们可以尝试继续增大 r k r_k ,直到右侧出现了重复字符为止。

image.png

用人话就是这样:

  • 第一步: 创建一个set用来存放不重复的字符串;maxLength为长度;两个指针,第一个指针j指向字符串的开头用于标记是第几个重复,第二个指针i跟着循环遍历字符串

  • 第二步:判断set里面有没有s[i],如果没有说明目前还没有重复的字符串,可以把是s[i]添加到set里;并且比较maxLength和现在set的长度,大的赋值给maxLength

  • 第三步:如果有s[i],说明有重复的了,则开始删除s[j],同时递增j

  • 第四步:开始重复第二步第三步直到遍历完整个字符串为止。

var lengthOfLongestSubstring = function(s) {
    let i= 0,j=0,maxLength=0;
    let set = new Set();
    if(s.length===0) return 0
    for(i = 0;i<s.length;i++){
        if(!set.has(s[i])){
            set.add(s[i])
            maxLength = Math.max(maxLength,set.size)
        }else{
            while(set.has(s[i])){
                set.delete(s[j])
                j++
            }
            set.add(s[i])
        }
    }
    return maxLength
};
复制代码

image.png

知识点

  • Math.max函数返回一组数中的最大值。

猜你喜欢

转载自juejin.im/post/7129154973639639077