【JavaScript】Leetcode 3.无重复字符的最长子串

该博客介绍了如何解决LeetCode中的3号问题——找到字符串中不含有重复字符的最长子串。文章通过暴力思路(双指针遍历,时间复杂度328ms)和滑动窗口解法(左指针和右指针构造滑动窗口,时间复杂度O(N))进行了详细讲解,并提供了相关链接和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

示例

示例 1:

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

示例 2:

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

示例 3:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

暴力思路

双指针遍历。存个临时字符串tempString,使用双指针i,j,从头开始,i不动,j往后移动,临时字符串逐个增加字符,一旦碰到和位置i字符重复的字符(判断方法是用indexof()),临时字符串清空,i往后移动一位,j重新从i后面开始移动。耗时328ms

var lengthOfLongestSubstring = function(s) {
    if (s.length <=1){
        return s.length;
    }
    let max = 0;
    let tempString = s[0];
    let i=0,j=1;
    while(j<s.length){
        if(tempString.indexOf(s[j])>=0){
            max = max > (j-i)? max:(j-i);
            i++;
            j=i+1;
            tempString =s[i];
            continue;
        }
        tempString += s[j];
        j++;
    }
    if(tempString.length>max){max = tempString.length;}
    return max;
};
滑动窗口解法

看了官方题解,滑动窗口解法。也是双指针,左指针和右指针构造了一个滑动的窗口。每一轮将左指针向右移动一格,不断地向右移动右指针,直到遇到重复的字符。在移动结束后,这个子串就对应着以左指针开始的,不包含重复字符的最长子串。

时间复杂度:O(N),其中 N 是字符串的长度。左指针和右指针分别会遍历整个字符串一次。空间复杂度最多有O(128),128是字符集的长度

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-by-leetc-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

var lengthOfLongestSubstring = function(s) {
    if (s.length==0||s.length==1) return s.length;
    let right=-1,ans=0;
    let occ = new Set();
    for(let left=0;left<s.length-1;left++){
        if(left!=0){
            occ.delete(s[left-1]);  
        }
        for(;right<s.length;right++){
            if(occ.has(s[right])){
                break;
            }
            occ.add(s[right]);
        }
        ans = Math.max(ans,right-left);
    }
    return ans;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值