美文网首页北美程序员面试干货
LeetCode 3 [Longest Substring Wi

LeetCode 3 [Longest Substring Wi

作者: Jason_Yuan | 来源:发表于2016-08-04 17:54 被阅读30次

    原题

    给定一个字符串,请找出其中无重复字符的最长子字符串。

    样例
    例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3。
    对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1。

    解题思路

    • 窗口类问题 - 最自然的方法双层for循环,时间复杂度O(n2)解决
    • 考虑优化 - 即那些状态不需要扫描呢?以"abcbcbb"为例
    • 第一:left = 0, right = 3时出现重复,则right = 4, 5, ...都不需要在考虑,直接退出while循环
    • 第二:上一步退出循环以后,下一个i从哪里开始?从left = 1开始吗?错。由于hashmap记录了每一个字母出现的位置,所以right = 3时,字母是b,导致了重复,所以i可以直接从上一个b出现的位置的下一个开始,本例中即left = 2,才能保证开始是合法的。
    • 最后的时间复杂度是O(2n) => O(n)

    完整代码

    class Solution(object):
        def lengthOfLongestSubstring(self, s):
            """
            :type s: str
            :rtype: int
            """
            left, res = 0, 0
            LastAppeared = {}
            for right in range(len(s)):
                # 如果出现重复,更新合法子串的左边界
                if s[right] in LastAppeared and LastAppeared[s[right]] >= left:
                    left = LastAppeared[s[right]] + 1
                LastAppeared[s[right]] = right
                res = max(res, right - left + 1)
            return res
    

    相关文章

      网友评论

        本文标题:LeetCode 3 [Longest Substring Wi

        本文链接:https://www.haomeiwen.com/subject/pngcsttx.html