zoukankan      html  css  js  c++  java
  • leetcode-最长无重复字符的子串

    参考他的人代码:https://blog.csdn.net/littlebai07/article/details/79100081

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

    示例 1:

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

    示例 2:

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

    示例 3:

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

                距离abcabcbb
    思路:遍历字符串,从一个字符到最后一个字符。如果字符不存在,则加入Map中,temp长度增加。
    i表示当前所在位置,i-temp表示map中字符串的初始位置。
    如果该字符已经在map中存在,则分两种情况处理:1.当前遍历的字符的位置在i-temp的范围内,那么
    将temp截断。也就是重新在i+1的位置开始遍历字符串的。比如abca,temp=当前位置(4)减去第一个a的位置(1),也就是从第二个a开始
    遍历字符串。
    2.如果当前遍历的字符串不在i-temp的范围内,temp++,同时立即更新该字符串在map中的位置,比如abdacbeg,从第二个a开始重新遍历,
    遇到第二个b,由于第一个b的字符不在i-temp的范围内,因此temp+1,同时更新b的map。
    字符串Maptemp
    a—-bcabcbb {a:0} 1
    ab—-cabcbb {a:0,b:1} 2
    abc—-abcbb {a:0,b:1,c:2} 3
    abca—-bcbb {a:3,b:1,c:2} 3
    abcab—-cbb {a:3,b:4,c:2} 3
    abcabc—-bb {a:3,b:4,c:5} 3
    abcabcb—-b {a:3,b:6,c:5} 2
    abcabcbb {a:3,b:7,c:5} 1

    代码如下:

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            char [] c=s.toCharArray();
            int len=s.length();
           Map<Character,Integer> map=new HashMap();
            int max=Integer.MIN_VALUE;
            int temp=0;
            for(int i=0;i<len;i++){
                if(map.containsKey(c[i])){
                    if(map.get(c[i])+temp<i){ // 列举到第二个C的时候,此时temp截断,从c开始计算位置,i-temp表示起始位置
                        temp++;
                    }else{
                        max=Math.max(temp,max);   
                        temp=i-map.get(c[i]);
                    }
                    map.put(c[i],i);
                }else {
                    map.put(c[i],i);
                    temp++;
                }
            }
            max=Math.max(max,temp);
            return max;
        }
    }

    如果有不理解的地方,希望读者可以自己举例,或者通过Java中的Debug,可以清晰地了解字符串遍历的过程。

  • 相关阅读:
    react的CSS中 :global的含义
    TypeScript中的问号 ? 与感叹号 ! 的含义
    移动端1px问题的解决方案
    原生js实现call,apply以及bind
    哪些场景不能使用箭头函数
    线性渐变、径向渐变以及圆锥渐变
    vue 开发中实现provide和inject实现依赖注入
    inline-block元素去除间隙
    clientWidth、offsetWidth、scrollWidth的区别
    session、token和cookie
  • 原文地址:https://www.cnblogs.com/patatoforsyj/p/9505692.html
Copyright © 2011-2022 走看看