难度: 中等
题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例1
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2
输入: s = ""
输出: 0
解题思路(滑动窗口)
滑动窗⼝的右边界不断的右移,只要没有重复的字符,就持续向右扩⼤窗⼝边界。⼀旦出现了重复字 符,就需要缩⼩左边界,直到重复的字符移出了左边界(使用map可直接将左边界跳转到正确的位置),然后继续移动滑动窗⼝的右边界。以此类推, 每次移动需要计算当前⻓度,并判断是否需要更新最⼤⻓度,最终最⼤的值就是题⽬中的所求。
(a)b c a b c b b
(a b)c a b c b b
(a b c)a b c b b
a(b c a)b c b b
a(b c a b)c b b
a b(c a b)c b b
a b c(a b c)b b
a b c a b(c b)b
a b c a b c b(b)
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
HashMap<Character, Integer> map = new HashMap<>();
int result = 0, start = 0;
for (int end = 0; end < s.length(); end++) {
// 取右端字符key
char key = s.charAt(end);
if (map.containsKey(key)) { // key在map中
// 如果滑动窗口中包含key,则令窗口左边界移动至不包含key位置
start = Math.max(start, map.get(key) + 1);
}
// 每次都计算最长窗口长度,防止出现没有重复字符情况下最长长度为初始值
result = Math.max(end - start + 1, result);
// 添加or更新字符最大位置
map.put(key, end);
}
return result;
}
}