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

时间:2020-06-04 14:10:46

标签: python string

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

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

this = list(map(str, input()))
def function(list):
    dict = {}
    count = 0
    result = [1]

我在这里开始循环,对于每个元素(如果不在键中)我创建一个键 值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('')

我需要别人的帮助来告诉我解决问题的方法在哪里错误,然后编辑代码。

2 个答案:

答案 0 :(得分:1)

希望您可能会发现这容易一些。这样做的目的是跟踪set中直到给定点的可见子字符串,以加快查找速度;如果包含当前值,请重新构建集合并追加到该点为止的子字符串。正如您提到的,您必须检查是否添加了最后一个值,因此要检查最后一个if

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))

max(out, key=len)
# 'agfht'

一些关键区别:

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

答案 1 :(得分:0)

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

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
相关问题