题目链接
滑动窗口(双指针)
思路:
- 初始化:
- 检查字符串的长度。如果长度为0或1,则直接返回长度,因为这样的字符串本身就是无重复的。
- 初始化两个指针 slow 和 fast,分别代表当前最长无重复子字符串的起始位置和当前遍历的位置。
- 创建一个 HashMap,用于存储字符及其最后一次出现的索引。
- 遍历字符串:
- 使用 fast 指针遍历字符串 s。
- 对于每个字符,检查 HashMap 是否包含该字符。
- 如果包含,说明找到了一个重复字符。将 slow 指针移动到重复字符的下一个位置,然后更新 HashMap 中的索引。
- 如果不包含,直接将字符及其索引添加到 HashMap 中。
- 更新最长子字符串长度:
在每次 fast 指针移动后,计算当前无重复子字符串的长度(即 fast - slow + 1)
,并与当前记录的最长子字符串长度 res 进行比较,取较大值作为新的最长子字符串长度。 - 返回结果:
当 fast 指针遍历完整个字符串时,返回记录的最长子字符串长度 res。
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length() == 0 || s.length() == 1){
return s.length();
}
int slow = 0;
int fast = 0;
int res = 0;
HashMap<Character, Integer> hashMap = new HashMap<>();
while(fast < s.length()){
if(hashMap.containsKey(s.charAt(fast))){
// slow指针移动到重复字符的下一个位置
slow = Math.max(slow, hashMap.get(s.charAt(fast)) + 1);
}
hashMap.put(s.charAt(fast), fast);
res = Math.max(res, fast - slow + 1);
fast++;
}
return res;
}
}
尝试向哈希表中添加一个键值对,其中键与哈希表中已有的键相同,HashMap
不会修改现有键的值,而是会创建一个新的键值对,这将导致哈希表中存在多个具有相同键的项。
所以本题slow的更新需要取slow = Math.max(slow, hashMap.get(s.charAt(fast)) + 1);