一图看懂leetcode3.无重复字符的最长子串

javascript版

3.给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
在这里插入图片描述

代码源自官网,时间复杂度:O(N),空间复杂度:O(∣Σ∣),目前是leetcode的最优解,多看看官方的代码,能够启迪自己编程的思维。涉及到子串的问题,大家可以多考虑一下窗口滑动的解题思路for下面内嵌一个while循环,用一个变量来记录保存次数。

不少人在一开始刷算法的时候,总是要花费太多的时间去看官方的解析,一般文字的描述理解起来是比较吃力的,我一开始刷算法的时候花了很多的时间去学习算法的涉及的知识点,也去画流程图去理解这个算法。为了节省大家的理解时间,我做了一个流程图,来让大家更好理解算法的流程。

因为for循环是累加的,每执行一次for循环就删除一个字母(根据字符串的下标位置),然后利用while循环做窗口向右滑动,用rk++记录不重复的字符串,执行到i=5的时候,字符串已经只剩下一个W了。

for总共循环执行6次,每次for循环开启while循环,调用add和delete方法
for总共循环执行6次,每次for循环开启while循环,调用add和delete方法。这里的js是es6语法的特性,let保存的变量都是独立的地址值,不懂的,大家可以去看看var,let和const的区别。链接->link

i=0的时候,while窗口的滑动
在这里插入图片描述

i=2的时候,while窗口的滑动
在这里插入图片描述

/*涉及的几个知识点
1.has方法
has()判断在has集合是否有重复元素
const s = new Set();
s.add(1).add(2).add(3);
s.has(1) //结果为true,出现过。
2.js中的charAt()方法,返回在指定位置的字符。
var str = "HELLO WORLD";
var n = str.charAt(2)  //返回的是L
3.Math.max()方法,整数,负数,浮点数都支持
该方法的返回类型为number ,它返回传递的参数的最大值。
console.log(Math.max(-1, 4, 6, 12)); //结果是12
console.log(Math.max(3.14, 43, 1, 0.2));//结果是43
console.log(Math.max(0, -13, 4, 654));  //结果是654
console.log(Math.max("0.65", "-23"));  //结果是-0.65
*/
var lengthOfLongestSubstring = function(s) {
    // 哈希集合,记录每个字符是否出现过
    const occ = new Set();
    const n = s.length;
    // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
    let rk = -1, ans = 0;
    for (let i = 0; i < n; ++i) {
        if (i != 0) {
            // 左指针向右移动一格,移除一个字符
            occ.delete(s.charAt(i - 1));
        }
        while (rk + 1 < n && !occ.has(s.charAt(rk + 1))) {
            // 不断地移动右指针
            occ.add(s.charAt(rk + 1));
            ++rk;
        }
        // 第 i 到 rk 个字符是一个极长的无重复字符子串
        ans = Math.max(ans, rk - i + 1);
    }
    return ans;
};

也许有人疑惑for下面不是有一个while循环吗?为什么时间复杂度是O(n),其实这个while循环只是重复执行一次代码,无论多少次while,都没有进入循环的代码体,所以这个while的时间复杂度是O(1)。时间复杂度,常数项可以忽略不计。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值