剑指 Offer 48. 最长不含重复字符的子字符串
程序员文章站
2022-07-14 07:58:54
...
LeetCode: 剑指 Offer 48. 最长不含重复字符的子字符串
根据题目提示: 哈希表、双指针
滑动窗口
- 定义需要用到的变量: map 、fast 快指针、slow 慢指针
- slow 记录滑动窗口的起始 (即重复元素的下标 index + 1 的位置)
- fast 遍历整个 string, 遇到重复的元素停下 >> 进行slow、mx 、map 更新等
滑动窗口
维护一个元素不重复的窗口
public int lengthOfLongestSubstring(String s) {
if("".equals(s) || s.length() == 0) return 0;
if(s.length() == 1) return 1;
int ans = 0;
// 滑动窗口
int fast = 1, slow = 0;
// 记录字符下标
Map<Character, Integer> map = new HashMap<>();
char[] chars = s.toCharArray();
map.put(chars[slow], slow);
int mx = 1;
while (fast < s.length()){
if(map.containsKey(chars[fast])){
// 包含 >> 出现重复了
ans = Math.max(ans, mx);
// 相同字符的前一个下标
Integer index = map.get(chars[fast]);
// 与 slow 的距离
int dis = index - slow + 1;
// 更新 mx
mx -= dis;
// 清空多余的字符记录
for (int i = slow; i <= index; i++) {
map.remove(chars[i]);
}
slow = index+1;
}
mx++;
map.put(chars[fast], fast);
fast++;
if(fast == s.length()) return Math.max(ans, mx);
}
return ans;
}
内容: d v d f
下标: 0 1 2 3
遇到 第二个 d(index = 2)时 >> slow 更新到 index = 1 >> index + 1
解题思路:
推荐阅读
-
Leetcode刷题记录——面试题48. 最长不含重复字符的子字符串
-
20200329-剑指offer-面试题48. 最长不含重复字符的子字符串(滑动窗口)
-
剑指 Offer 48. 最长不含重复字符的子字符串
-
剑指 Offer 48. 最长不含重复字符的子字符串
-
剑指Offer 48. 最长不含重复字符的子字符串(Medium)
-
Leetcode 剑指 Offer 48. 最长不含重复字符的子字符串
-
剑指 Offer 48. 最长不含重复字符的子字符串 -- DP解法
-
《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和
-
leetcode 3 最长不含重复字符的子字符串
-
(C++)剑指offer-54:字符流中第一个不重复的字符(字符串)