【问题标题】:find the longest substring want to make code faster找到最长的子串想让代码更快
【发布时间】:2019-08-06 11:00:39
【问题描述】:

试图找到字符串中最长的子串

“abcdab”的最长子串是“abcd”
给定一个字符串,求最长子串的长度 重复字符。

 def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        result = ""
        result_temp = ""
        for i in range(len(s)+1):
            for j in range(i+1,len(s)+1):
                if (len(result_temp) <= len(s[i:j])) and  (s[i:j][-1:] not in result_temp):
                    result_temp = s[i:j]
                else:
                    result = result_temp if len(result) < len(result_temp) else result
                    result_temp = ""
                    break
        result = result_temp if len(result) < len(result_temp) else result
        return len(result)

我想让这段代码更快
有没有办法让代码更快?

【问题讨论】:

  • 给定一个字符串,找出最长不重复字符的子串的长度。
  • @AlexanderZhang:“最长子串”问题通常是“最长公共子串”的缩写(在两个不同的字符串之间)。我承认发布的代码似乎不适合这个(只涉及一个字符串);我可能错误地添加了该标签。 编辑:是的,添加错误,我已经删除了标签。

标签: python optimization


【解决方案1】:

一种称为sliding window algorithm 的不同方式来执行此操作。

def lengthOfLongestSubstring(self, s: str) -> int:
    substring, length, max_len = "", 0, 0
    for c in s:
        if c in substring:
            index = substring.find(c)
            substring = substring[(index + 1)::]
        substring += c
        length = len(substring)
        if length > max_len:
            max_len = length

    return max_len

【讨论】:

  • 谢谢编译。你能解释一下为什么我的代码效率不高吗?
  • 你的代码时间复杂度是O(n^2),它反复检查一个char是否存在。
【解决方案2】:

这是解决此问题的另一种方法:

没有重复字符的最长子串的长度显然不能大于字母表的大小。所以我们可以遍历所有可能长度最大的子串,然后所有子串比那个短一个字符,依此类推,直到我们找到一个没有重复字符的子串。如果存在这种长度为i 的子字符串,那么长度为i - 1 的子字符串也存在,因此我们可以使用二分查找来进一步加快速度。我们还可以使用一组数据结构,在循环遍历子字符串时更新它,以便快速检查子字符串是否有重复字符。

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多