【leetcode】Day02 无重复子串

5 篇文章 0 订阅
3 篇文章 0 订阅

无重复子串

今天在刷这个无重复字串的时候,我感受到了leetcode深深的恶意,也让我明白了就是千万不能看例子来思考思路 先看下题目
在这里插入图片描述
看到题目的第一刻,我甚至有点想笑,感觉今天已经温了,游戏已经可以先排好队了,但是leetcode给了我一记迎头痛击,我第一版是这样的

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
    var count =0;
    var max = 0;
    var subString = '';
    while(count < s.length){
        // 如果字符没有在预定字串中出现过就添加 只要有一次 不相同就结束
        if(subString.indexOf(s.charAt(count)) == -1){
            subString += s.charAt(count);
        }else{
            (max < subString.length)?max = subString.length:null;
            subString = s.charAt(count);
        }
        count++;
    }
    return max;

};

大致思路就是循环从开始时,将字符存入字串中,然后如果找到不存的,就清空字串记录下max值,然后继续记录字串一直无重复到最终,我还是太傻太天真,leetcode780多个测试用例我在20多个就趴下了,他给了一个串dvdf,我靠我看到这个串的时候,不仅把游戏排队取消了,甚至还泡了杯枸杞,这一来就太难了,其实在内个时候也有别的选择,就是我在while中来一个for循环,美滋滋 但是毕竟是刷算法题 要老是这样其实我还不如不刷

所以我打算继续埋头苦 ,终于在经历了半个小时的挣扎后,我在无意中想起了在网络课程中的一个东西叫做滑动窗口 其实网络中的滑动窗口本来跟这个没什么关系,但是我当时为了搞懂滑动窗口,去研究了下滑动窗口的算法

概念:
滑动窗口算法可以用以解决数组/字符串的子元素问题,它可以将嵌套的循环问题,转换为单循环问题,降低时间复杂度。
原文地址 : https://www.zhihu.com/topic/20746237/intro

还是推荐去看下这是知乎的一个话题,里面有很多精彩的对答,然后回到正题其实所谓的滑动窗口算法,就是有一个值在字符串之类的数据中滑动~,所以我就直接上干货了

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
            var map = new Map();
            var count = 0;
            // 表示当前字串的开始位置下标
            var start = 0;
            var max = 0;
            while (count < s.length){
                var char = s.charAt(count);
                // map key存字符 value存上次出现的索引
                if (map.has(char) && map.get(char) >= start) {
                    start = map.get(char) + 1;
                    map.set(char, count);
                } else {
                    map.set(char, count);
                    var cul = count - start+1;
                    max = Math.max(max, cul);
                }
                count++;
            }
            return max;
        };

整体思路稍微说一下就是滑动变量 start表示无重复字串的起始位置,通过map中的重复key检查 如果重复并且字符的上一个位置(map中的值)大于当前子串的start索引值 那就说明stary需要移动了,然后max判断 遍历时的索引值,减去内个字串的起 始位置索引值,再加上索引与长度差的1 就是最大长度,如果想了解但看不明白 浏览器随便打断点看一下就ok

这个成绩 可能也是我目前最好的成绩了 但是今天占用的时间实在是有点多 继续加油吧
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值