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

  • 相关阅读:
    Visual Studio调试器指南---Disassembly窗口
    Visual Studio调试器指南---Register窗口
    Visual Studio调试器指南---Threads窗口
    关于System.Convert.ToInt16(float value)抛异常System.OverflowException---值对于 Int32 太大或太小的原因的探究
    关于System.OverflowException异常
    Visual Studio调试器指南---Memory 1-4窗口
    关于异常System.NullReferenceException
    关于C++标准异常之std::out_of_range
    VC调试器高级应用----高级断点篇
    Visual Studio调试器指南---CallStack窗口
  • 原文地址:https://www.cnblogs.com/patatoforsyj/p/9505692.html
Copyright © 2011-2022 走看看