• 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,可以清晰地了解字符串遍历的过程。

  • 相关阅读:
    Table XXX is marked as crashed and should be repaired问题
    冗余带来的麻烦
    thinkPHP模板引擎案例
    css案例学习之float浮动
    css案例学习之父子块的margin
    block,inline和inline-block概念和区别
    css案例学习之div与span的区别
    css案例学习之盒子模型
    css案例学习之层叠样式
    css案例学习之继承关系
  • 原文地址:https://www.cnblogs.com/patatoforsyj/p/9505692.html
Copyright © 2020-2023  润新知