📜  门|门 IT 2008 |第 36 题(1)

📅  最后修改于: 2023-12-03 15:12:46.847000             🧑  作者: Mango

门|门 IT 2008 |第 36 题

本题为门|门 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
总结

本题是一道比较典型的字符串处理问题,利用哈希表和双指针的算法思想可以解决。需要注意的是,题目要求的是最大不含重复字符的子串长度,因此在移动左指针时需要更新其位置,不能直接赋值为右指针加一。

(完)