📅  最后修改于: 2023-12-03 15:12:46.847000             🧑  作者: Mango
本题为门|门 IT 2008 的第 36 题,题目为:
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
例如,给定字符串 "abcabcbb",其不含有重复字符的最长子串为 "abc",长度为 3。又如,给定字符串 "bbbbb",其不含有重复字符的最长子串为 "b",长度为 1。
本题考察的是字符串处理,需要运用哈希表和双指针的算法思想,时间复杂度为 O(n)。
使用双指针的方法,维护一个滑动窗口,用来保存当前不包含重复字符的子串。定义左指针 left 和右指针 right,初始值都为 0。
首先将左指针向右移动,直到遇到第一个重复字符,在移动过程中记录当前的最大子串长度。然后将左指针移动到第一个重复字符的位置加一,右指针不动,接着继续移动右指针,重复上述过程,直到遍历完整个字符串。
过程中需要用哈希表记录每个字符的位置,便于快速查找是否重复。
具体实现可以参考以下代码:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
ans = 0
# 哈希表,记录每个字符的位置
dic = {}
# 定义左右指针
left = right = 0
while right < n:
if s[right] in dic:
# 更新左指针
left = max(left, dic[s[right]] + 1)
dic[s[right]] = right
# 更新最大子串长度
ans = max(ans, right - left + 1)
right += 1
return ans
本题是一道比较典型的字符串处理问题,利用哈希表和双指针的算法思想可以解决。需要注意的是,题目要求的是最大不含重复字符的子串长度,因此在移动左指针时需要更新其位置,不能直接赋值为右指针加一。
(完)