今天做这道!!
实际上看了很久题解才能自己做出来
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

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

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

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

  u1s1

思路:
   在这里我们设置一个动态窗口,窗口里面正是我们题意要求的无重复字符子串,当我们遇到重复的子串时,我们应该知道,窗口中重复的元素前面的所有元素都不能再包含在窗口里面了,比如aiocbjcabd 当我们判断到i=6也就是第二个c的时候,要想继续进行下一个子串的判断,那么第一个c之前的所有元素我们就应该跳过进而继续运行,也就是从i=4开始进行新的判断。

  
说真的 我脑子发烧了需要静一静
过程:

  我们先定义一个map用来作为我们动态窗口的载体,用count来储存窗口最大范围,这样我们就可以放心的去进行一个一个的子串判断而不需要担心最大窗口被覆盖的问题,第一步我们先对我们取得的元素进行判断,判断窗口中是否有相同的元素,如果有则窗口的最左边在下一次循环跳过窗口中相同元素,也就是代码中的i = Math.max(map.get(s.charAt(j))+1,i);在这里需要明确的是为什么使用max,因为map.put方***覆盖相同key的value,因此,遇到两个相同元素的时候,还没有来得及对重复元素的新位置进行put而导致窗口最左端向左边移动,这显然是不允许的,因为我们设定窗口时就已经确定窗口只能向一个方向运动,该方法的时间复杂度为O(n)。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character,Integer> map = new HashMap<Character, Integer>();
        int count=0;
        int n=s.length();
        for(int i=0,j=0;j<n;j++){
            if(map.containsKey(s.charAt(j))){
                i = Math.max(map.get(s.charAt(j))+1,i);
            }
            count = Math.max(j-i+1,count);
            map.put(s.charAt(j),j);
        }
        return count;
    }
}