
题解一:
滑动窗口+哈希表:假设字符串为"abcabcbb",遍历循环所有子串,以不同位置作为子串的起始,则会得到以下最长子串。其中最长子串的右端点会随着左端点的右移而右移,也可能不变,原因是最长子串后的第一位字符,一定在最长子串中出现过,例如"(abc)a"中‘a’出现在最长子串“abc”中。因而最长子串的某一位被移除(也就是若干次左端点右移)时,可能将重复的字符移除了,此时右端点就可以进行右移了。根据这点我们可以通过控制双指针的移动实现滑动窗口,优化暴力枚举,并利用HashSet哈希表去重。

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s.length() <= 1) return s.length();
        Set<Character> set = new HashSet<>();
        set.add(s.charAt(0));
        int maxlen = 0;
        int len = s.length();
        for (int left = 0, right = left + 1; left < len && right < len; left++) {
            while (right < len) {
                if (!set.contains(s.charAt(right))) {
                    set.add(s.charAt(right));
                    right++;
                } else {
                    break;
                }
            }
            int temp = right - left;
            if (maxlen < temp) maxlen = temp;
            set.remove(s.charAt(left));
        }
        return maxlen;
    }
} 
                

















