Python 字符串中非重复字母的最大子字符串

Python 字符串中非重复字母的最大子字符串,python,string,Python,String,从一开始我就想指出,我使用的是Python语言。在这个问题中,我最初有一个字符串。例如“abcagfhtgba”。我需要找到非重复字母的最大子字符串的长度。在上面提供的例子中,它是‘agfht’(5),因为在位置[4]处‘a’重复,所以我们从一开始就开始计数。 我对这个问题的想法是创建一个字典,它将字母存储为键,将字母的外观数字存储为值。每当任何键具有相应的值2时,我们将字典的长度附加到名为result的列表中,并用空列表完全替换它。对于某些测试,此方法适用,而对于某些测试则不适用。我将提供我使

从一开始我就想指出,我使用的是Python语言。在这个问题中,我最初有一个字符串。例如“abcagfhtgba”。我需要找到非重复字母的最大子字符串的长度。在上面提供的例子中,它是‘agfht’(5),因为在位置[4]处‘a’重复,所以我们从一开始就开始计数。 我对这个问题的想法是创建一个字典,它将字母存储为键,将字母的外观数字存储为值。每当任何键具有相应的值2时,我们将字典的长度附加到名为result的列表中,并用空列表完全替换它。对于某些测试,此方法适用,而对于某些测试则不适用。我将提供我使用的代码以及简短的解释注释

在这里,我以列表的形式存储输入

this = list(map(str, input()))
在这里,我开始循环,对于每个元素,如果它不在键中,我创建一个键 值为1。如果元素在字典中,我用空的替换dict。我不会忘记将第一个重复元素存储在一个新字典中,并执行此操作。另一个重要的点是在循环结束后追加计数。因为应该考虑字符串的尾部(如果它具有最大的非重复字母序列)

    for i in range(len(list)):
        if list[i] not in dict:
            dict[list[i]] = 1
            count += 1
        elif list[i] in dict:
            dict = {}
            dict[list[i]] = 1
            result.append(count)
            count = 1
    result.append(count)
    print(result)
    return max(result)
在这里,我让我的函数在字符串和它的倒数之间选择最大值,以处理“adabc”的情况,其中最大的子字符串位于末尾

if len(this) != 0:
    print(max(function(this), function(this[::-1])))
else:
    print('')

我需要人们的帮助,告诉我在解决问题的方法中哪里我错了,并编辑我的代码

希望你会发现这更容易一点。这样做的目的是跟踪
集合中给定点之前看到的子串
,以便更快地查找,如果包含当前值,则重新构建集合并将看到的子串附加到该点。正如您所提到的,您必须检查是否添加了最后的值,因此,如果

s = 'abcagfhtgba'

seen = set()
out = []
current_out = []
for i in s:
    if i not in seen:
        current_out += i
        seen.update(i)
    else:
        seen = set(i)
        out.append(''.join(current_out))
        current_out = [i]
if current_out:
    out.append(''.join(current_out))


因此,有一些关键区别:

  • 迭代字符串本身,而不是范围
  • 使用集合而不是计数和字典

记住你看到的最后一个副本,维护一个要索引的字母地图。如果您已经看到,那么这是重复的,因此我们需要重置索引。但是索引可以是这个新的,也可以是在看到最后一个重复字符之后

s = 'abcagfhtgba'

seen = dict()
longest = ""
start = 0
last_duplicate = 0
for i, c in enumerate(s):
    if seen.has_key(c):
        if len(longest) < (i - start + 1):
            longest = s[start:i]
        new_start = seen.get(c) + 1
        if last_duplicate > new_start:
            start = i
        else:
            start = new_start
        last_duplicate = i
    seen[c] = I
if len(longest) < (len(s) - start + 1):
   longest = s[start:]
print longest
s='abcagfhtgba'
seen=dict()
最长=“”
开始=0
最后一次重复=0
对于枚举中的i、c:
如果看到。有_键(c):
如果长度(最长)<(i-开始+1):
最长=s[开始:i]
new_start=seen.get(c)+1
如果上次\u复制>新建\u开始:
开始=i
其他:
开始=新的开始
最后一次重复=i
见[c]=I
如果len(最长)<(len(s)-开始+1):
最长=秒[开始:]
打印最长
max(out, key=len)
# 'agfht'
s = 'abcagfhtgba'

seen = dict()
longest = ""
start = 0
last_duplicate = 0
for i, c in enumerate(s):
    if seen.has_key(c):
        if len(longest) < (i - start + 1):
            longest = s[start:i]
        new_start = seen.get(c) + 1
        if last_duplicate > new_start:
            start = i
        else:
            start = new_start
        last_duplicate = i
    seen[c] = I
if len(longest) < (len(s) - start + 1):
   longest = s[start:]
print longest