题解一:
滑动窗口+哈希表:假设字符串为"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;
}
}