// 案例:字符串s= "abcc",
// 无重复字符的最长子串
// 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
public int lengthOfLongestSubstring(String s) {
// 定义一个map,key用来存放字符串s中的字符
Map<Character, Integer> itemToIndexMap = new HashMap<>();
// 最大的下标
int maxLen = 0;
// 左下标
int left = 0;
// 遍历字符串s
for (int i = 0; i < s.length(); i++) {
// 将每个字符都取出并赋值给ch
char ch = s.charAt(i);
// 在第二个判断条件中,重复的字符不在窗口内,故不影响
// 案例中的前三个都不同所以直接进入if并跳过
if (!itemToIndexMap.containsKey(ch) || itemToIndexMap.get(ch) < left) {
// 窗口内没有重复字符,将当前字符添加到map的key中,并跳过
itemToIndexMap.put(ch, i);
continue;
}
// 案例第四个出现重复字符
// 更新最大长度值:maxLen = 3
maxLen = Math.max(maxLen, i - left);
// 更新最左下标:itemToIndexMap.get(ch)中获取的是第三个字符,value是2,left= 3
left = Math.max(left, itemToIndexMap.get(ch) + 1);
// 增加重复字符的下标
itemToIndexMap.put(ch, i);
}
// 到了这一步,maxLen = 3,left = 3,所以s.length() - left = 4 - 3 = 1,
// 取最大值
maxLen = Math.max(maxLen, s.length() - left);
return maxLen;