LeetCode每日一题:3.无重复字符的最长子串(十六)

无重复字符的最长子串

一、LeetCode题解

瞧一瞧~

二、算法题

题目

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

示例 1:

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

解法一(常规思路)

思路
  • 一、从头添加数组,遇到重复的就打断循环->从第二位进行比较,记录数组长度
  • 二、重复之前的动作,比较当前数组长度与上一次数组长度
  • 三、考虑边界,每次 下标++,数组长度–
  • 判断过程就是一个可以滑动和伸缩的格子,他套住一个又一个满足条件的值,最后返回了各自的长度
var lengthOfLongestSubstring = function(s) {
    var arr = s.split('')
    var nums = [],len = arr.length,resMax = 0,index = 0
    while(index < len){
        var max = 0
        for(let i = 0; i < arr.length; i++){
            if(nums.indexOf(arr[i]) == -1){
                nums.push(arr[i])
                max = nums.length > max ? nums.length : max
            }else{
                nums = []
                break
            }
        }
        resMax = max > resMax ? max : resMax 
        arr.shift()
        index++
    }
    return resMax
};

此思路虽然还有优化的空间(比如,条件判断缩减为 index < len - resMax、arr.slice(indexOf(arr[i])) 等等),但是超高的时间和空间占用率都表明它是不推荐的说来惭愧,想出来的结果离最优解还是有差距

沿用这种思路,我们将它抽离出来并形成解法二

解法二(滑动窗口)

思路
  • 一、从0开始判断新字符串是否存在当前值(有一点类似去重的前半部分)
  • 二、随时更新字符串长度,用于得到max值
  • 三、如果发现了重复项我们虽然会继续添加,但是我们从相同值首次出现的位置截取之后一位截取。
var lengthOfLongestSubstring = function(s) {
    let len = 0;
    let val = '';
    for (let i = 0; i < s.length; i++) {
        if (val.indexOf(s[i]) === -1) {
            val = val + s[i];
            if (val.length > len) {
                len = val.length;
            }
        } else {
            val = val + s[i];
            let index = val.indexOf(s[i]);
            val = val.slice(index + 1);
        }
    }
    return len;
};
结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余光、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值