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)。虽然此代码可以回答问题,但提供有关如何和/或为什么解决问题的附加上下文将提高答案的长期价值。虽然此代码可以回答问题,但提供有关如何和/或为什么解决问题的附加上下文将提高答案的长期价值。