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

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

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

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

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

解释下: 子串是一段连续的字符。 子序列不是,
重点来了:

这个题目只是需要找到最大长度,而不是要找出对应的字符串。

这个最大长度一直都在变化中,是一直都在比较。

      max 是一直都在变化中的,我们只是保存最大的而已。
     
      使用2个指针,和滑动窗口
      1:fast slow 指针,一开始都指向0。如果没有重复的,那fast 指针就向后移动一位
      2:使用map来判断当前元素是否已经存在,
      3:如果当fast 遇到有重复的数据了,例如现在fast在下标10。slow在下标5。当fast移动到下标11的时候,发现11和5重复了(也就是fast和slow对应的值一样了),那么就移动slow指针,
      将它移动到上一次出现位置的下一个位置,也就是移动slow 到 map.get(slow)+1 的位置上。 因为5-10是不重复的,5和11重复,那么6-11 就是不重复的数据。
      max=fast-slow +1  。因为这个题目是一直都在遍历中,所以每次都要用max来比较,
      所有max=Math.max(max,slow-fast+1);
      如果数据是 abca 当a再加入进去的时候,上一次指向a是0 这次应该移动到1 有效的字符串应该是bca  此时左指针应该是 get(b)+1=1
     如果数据是 abba 当b再进去的时候,此时 上一次指向b的是1 这次应该是移动到2。字段变为了b  当a 再加上去的时候,发现又出现了重复,第一次a是0 现在a是3
     那么按照道理 slow 要从2变为0+1 到1 了,就变成了会退。相当于慢指针往后走了,实际上应该不变,最后字段是ba 才对。
     为了处理问题。
     我们每次获取slow=map.get(重复字符)+1 都要与当前的slow 对比,
     例如 abba 第一次b 重复了 slow =map.get(b)+1=2  此时的max=2-1+1=2
     第二次a 重复了 按照逻辑就是slow=map.get(a)+1=0+1=1 但是上一次slow 已经变成了2 如果回退,那字段就是 bba了。本身就重复了,所以我们需要对slow进行比较,
    slow=Math.max(slow,map.get(重复字符)+1); 这次slow就还是2,此时max=2-2+1=1 因为max是一直在变化,所以max=2 字段变为了ba
    解决了abba的问题后,每一次遍历字符的时候,都应该更新下 当前字符 以及他的下标。
    更新的重点在于下标,主要是因为只有通过下标定位,你才能知道上一次重复字段的下标是多少
    public int lengthOfLongestSubstring3(String s) {
        int max=0;
        int len=s.length();
        int left=0;
        Map<Character,Integer> map=new HashMap<>(len);
        for (int i = 0; i < len; i++) {
            char c = s.charAt(i);
            if(map.containsKey(c)){
                left=Math.max(left,map.get(c)+1);
            }
            map.put(c,i);
            max=Math.max(max,i-left+1);
        }
        return max;
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容