python中无重复字符的最长子字符串

python中无重复字符的最长子字符串,python,algorithm,Python,Algorithm,这是一个相当标准的面试问题。查找不重复字符的最长子字符串。下面是测试用例 abcabcbb -> 3 bbbbb -> 1 pwwkew -> 3 bpfbhmipx -> 7 tmmzuxt -> 5 下面是我的代码,它使用了一种非常简单的方法,有两个指针 def lengthOfLongestSubstring(s): checklist = {} starting_index_of_current_substring = 0 leng

这是一个相当标准的面试问题。查找不重复字符的最长子字符串。下面是测试用例

abcabcbb -> 3
bbbbb -> 1
pwwkew -> 3
bpfbhmipx -> 7
tmmzuxt -> 5
下面是我的代码,它使用了一种非常简单的方法,有两个指针

def lengthOfLongestSubstring(s):
    checklist = {}
    starting_index_of_current_substring = 0
    length_of_longest_substring = 0
    for i, v in enumerate(s):
        if v in checklist:
            starting_index_of_current_substring = checklist[v] + 1
        else:
            length_of_current_substring = i - starting_index_of_current_substring + 1
            length_of_longest_substring = max(length_of_current_substring, length_of_longest_substring)

        checklist[v] = i
    return length_of_longest_substring

我的代码通过了除最后一个测试用例之外的所有测试用例(实际4个,预期5个)。有人能帮我修改代码来处理最后一个测试用例吗。我不想重新发明算法。

这里是代码中的一个简单调整,使用两个指针查找最长的子字符串,而不需要重复字符

代码中的更改是,当检查表中不存在v时,不计算最长子字符串的长度,而是计算所有情况下最长子字符串的长度

def lengthOfLongestSubstring(s):
    checklist = {}
    starting_index_of_current_substring = 0
    length_of_longest_substring = 0
    for i, v in enumerate(s):
        if v in checklist:
            starting_index_of_current_substring = max(starting_index_of_current_substring, checklist[v] + 1)
        checklist[v] = i
        length_of_longest_substring = max(length_of_longest_substring, i - starting_index_of_current_substring + 1)
    return length_of_longest_substring

## Main
result = {}
for string in ['abcabcbb', 'bbbbb', 'ppwwkew', 'wcabcdeghi', 'bpfbhmipx', 'tmmzuxt', 'AABGAKGIMN', 'stackoverflow']:
    result[string] = lengthOfLongestSubstring(string)
print(result)
样本运行:

{'abcabcbb': 3, 'bbbbb': 1, 'ppwwkew': 3, 'wcabcdeghi': 8, 'bpfbhmipx': 7, 'tmmzuxt': 5, 'AABGAKGIMN': 6, 'stackoverflow': 11}

下面是代码中的一个简单调整,使用两个指针查找最长的子字符串,而无需重复字符

代码中的更改是,当检查表中不存在v时,不计算最长子字符串的长度,而是计算所有情况下最长子字符串的长度

def lengthOfLongestSubstring(s):
    checklist = {}
    starting_index_of_current_substring = 0
    length_of_longest_substring = 0
    for i, v in enumerate(s):
        if v in checklist:
            starting_index_of_current_substring = max(starting_index_of_current_substring, checklist[v] + 1)
        checklist[v] = i
        length_of_longest_substring = max(length_of_longest_substring, i - starting_index_of_current_substring + 1)
    return length_of_longest_substring

## Main
result = {}
for string in ['abcabcbb', 'bbbbb', 'ppwwkew', 'wcabcdeghi', 'bpfbhmipx', 'tmmzuxt', 'AABGAKGIMN', 'stackoverflow']:
    result[string] = lengthOfLongestSubstring(string)
print(result)
样本运行:

{'abcabcbb': 3, 'bbbbb': 1, 'ppwwkew': 3, 'wcabcdeghi': 8, 'bpfbhmipx': 7, 'tmmzuxt': 5, 'AABGAKGIMN': 6, 'stackoverflow': 11}

这并不是真正迭代您的解决方案,但这是一种更简单的方法,只是为了让您知道如何解决它

def longest_substr(s):
    longest = 0
    for start_index in range(len(s)):
        contains = set()
        for letter in s[start_index:]:
            if letter in contains:
                break
            contains.add(letter)
        longest = max(longest, len(contains))
    return longest

这并不是真正迭代您的解决方案,但这是一种更简单的方法,只是为了让您知道如何解决它

def longest_substr(s):
    longest = 0
    for start_index in range(len(s)):
        contains = set()
        for letter in s[start_index:]:
            if letter in contains:
                break
            contains.add(letter)
        longest = max(longest, len(contains))
    return longest
0

我更喜欢这个解决方案>>

优化了时间和空间管理:

def lengthOfLongestSubstring(self, s: str) -> int:
curlen = maxlen = 0 # curlen saves the max len of substrings ending with current num
for i, num in enumerate(s):
    curlen -= s[i-curlen:i].find(num)
    maxlen = max(maxlen, curlen)
return maxlen
0

我更喜欢这个解决方案>>

优化了时间和空间管理:

def lengthOfLongestSubstring(self, s: str) -> int:
curlen = maxlen = 0 # curlen saves the max len of substrings ending with current num
for i, num in enumerate(s):
    curlen -= s[i-curlen:i].find(num)
    maxlen = max(maxlen, curlen)
return maxlen

这篇文章很旧,但我认为我的解决方案修复了原始代码中的错误

def lengthOfLongestSubstring(s):
    checklist = {}
    starting_index_of_current_substring = 0
    length_of_longest_substring = 0
    for i, v in enumerate(s):
        if v in checklist:
          if checklist[v] >= starting_index_of_current_substring:
                        starting_index_of_current_substring = checklist[v] + 1

        length_of_current_substring = i - starting_index_of_current_substring + 1
        length_of_longest_substring = max(length_of_current_substring, length_of_longest_substring)
                checklist[v] = i
     return length_of_longest_substring

这篇文章很旧,但我认为我的解决方案修复了原始代码中的错误

def lengthOfLongestSubstring(s):
    checklist = {}
    starting_index_of_current_substring = 0
    length_of_longest_substring = 0
    for i, v in enumerate(s):
        if v in checklist:
          if checklist[v] >= starting_index_of_current_substring:
                        starting_index_of_current_substring = checklist[v] + 1

        length_of_current_substring = i - starting_index_of_current_substring + 1
        length_of_longest_substring = max(length_of_current_substring, length_of_longest_substring)
                checklist[v] = i
     return length_of_longest_substring
在不重复字符的字符串中查找最长的子字符串。 在不重复字符的字符串中查找最长的子字符串。
当您将起始指针向前跳转时,您不会修正
检查表
,以说明子字符串中不再包含的字符。向下投票者,您能解释一下原因吗?这个问题有个问题需要回答吗?@ChihebNexus:如果你说的是对现在删除的答案的反对票,那么他们两个都错了。您的错误是因为您只是计算不同的字符,而不是只计算具有不同字符的最长子字符串的长度。(可能您考虑的是非连续的子序列,而不是子字符串。)@ChihebNexus子字符串是字符串的连续部分
“foo”
“foobar”
的子字符串(子字符串由切片
“foobar”[:3]表示)
是的!谢谢@adamsmith!当你把起始指针向前跳时,你不必修改
检查表来解释子字符串中不再出现的字符。下选者,你能解释一下为什么吗?回答这个问题有个问题吗?@ChihebNexus:如果你说的是对现在删除的答案的下选,他们两个都是w错误。您的错误是因为您只是计算不同的字符,而没有找到只有不同字符的最长子字符串的长度。(可能您考虑的是非连续子序列,而不是子字符串。)@ChihebNexus子字符串是字符串的连续部分。
“foo”
“foobar”
的子字符串(由切片
“foobar”[:3]
表示的子字符串)
是的!谢谢@adamsmith我得到了它如果你忽略了从
枚举
中得到的值,你可能应该只在
范围(len(s))
上循环。这个解决方案是O(n2),我的是O(n)。如果忽略从
enumerate
获得的值,则可能只需在
range(len(s))
上循环。此解决方案为O(n2),我的为O(n)。虽然此代码可以回答问题,但提供有关如何和/或为什么解决问题的附加上下文将提高答案的长期价值。虽然此代码可以回答问题,但提供有关如何和/或为什么解决问题的附加上下文将提高答案的长期价值。