今天这道题蛮有趣,话不多说,先上题目:

字串?最长?第一次接触可能会有点懵。

(画重点!!!)
这一道题属于经典的 Sliding Window 题目(滑动窗口)。
什么是Sliding Window


看一下示例:

- 首先,我们先定义左右指针(左右边界,控制窗口的大小)
- 移动右指针,直到遇到重复的字母就停止,保存当前字串的长度。
- 左指针向前一个单位,直到子串没有重复,右指针不动。(因为已经重复了,再移动右指针也没用):
- 右指针继续搜寻(尽可能扩大字串的长度),直到遇到重复的字母停止,及时追踪子串的长度,若当前最长,更新
res的值。(子串有可能所有字母无重复)
重复上述过程。

总结
- HashMap 和 HashSet 在面试题中十分常见,需要熟练掌握。
- 滑动窗口可以有效避免重复计算,加快扫描速度。
代码(Java)
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length() == 1) { // corner case
return 1;
}
int left = 0; // left pointer
int right = 0; // right pointer
int res = 0;
HashSet<Character> set = new HashSet<Character>();
while (left <= right && right < s.length()) {
if (!set.contains(s.charAt(right))) {
set.add(s.charAt(right++)); // move forward the right pointer
// keep tracking the max length
// because each character of the string may be unique
res = Math.max(right - left, res);
} else { // we meet repeating character
set.remove(s.charAt(left++)); // move forward the left pointer
}
}
return res;
}
}
/*
Time Complexity: O(n)
Space Complexity: O(n)
*/
个人GitHub: github.com/ceezyyy/Lee…
创作不易,您的点赞是对我最大的支持!