题目:
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:s.length <= 40000
解题思路:
本题采用滑动窗口,利用哈希表来做优化。使用哈希表记录每个字符的下一个索引,然后尽量向右移动尾指针来拓展窗口,并更新窗口的最大长度。如果尾指针指向的元素重复,则头指针直接移动到窗口中重复元素的右侧。
步骤:
- tail指针向末尾方向移动;
- 如果尾指针指向的元素存在于哈希表中,则head指针跳跃到重复字符的下一位;
- 更新哈希表和窗口长度。
代码:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
hashmap = {}
head, res = 0, 0
for tail in range(n):
if s[tail] in hashmap:
head = max(hashmap[s[tail]], head)
hashmap[s[tail]] = tail + 1
res = max(res, tail - head + 1)
return res
复杂度:
- 时间复杂度:O(N),遍历s,哈希表中查找的时间复杂度为O(1)
- 空间复杂度:O(N),使用了哈希表