python中没有重复字符的最长子字符串

时间:2017-06-05 21:19:42

标签: python algorithm

这是一个非常标准的面试问题。找到最长的子字符串而不重复字符。以下是测试用例,

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)之外的所有测试用例。有人可以帮我修改代码来处理上一个测试用例。我不想重新发明算法。

6 个答案:

答案 0 :(得分:3)

以下是代码中的一个简单调整,其中包含2个指针,用于查找最长的子字符串而不重复字符。

代码中的更改不是计算核对清单中不存在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}

答案 1 :(得分:1)

这篇文章相当老,但是我认为我的解决方案可以修复原始代码中的错误。

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

答案 2 :(得分:0)

谢谢@ user2357112我用你的提示搞清楚了。

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

答案 3 :(得分:0)

这并没有真正迭代你的解决方案,但这是一个更简单的方法,只是为了让你知道如何解决它。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

在字符串中找到最长的子串,没有重复的字符。


def find_non_repeating_substring(input_str):
    output_length = 0
    longest_sub_str = ''
    len_str = len(input_str)
    index = 0
    while len_str != 1:
        l_str = ''
        for i in range(index, len(input_str)):
            if input_str[i] not in l_str:
                l_str = l_str + input_str[i]
            else:
                break
        
        sub_str_length = len(l_str)
        if sub_str_length >  output_length:
            output_length = sub_str_length
            longest_sub_str = l_str
        len_str = len_str -1
        index = index + 1
    return output_length,longest_sub_str
if __name__ == '__main__':
    input_str = raw_input("Please enter the string: ")
    sub_str_length, sub_str = find_non_repeating_substring(input_str)
    print ('Longest Substing lenght is "{0}" and the sub string is "{1}"'.format(sub_str_length, sub_str))```