从一开始,我想指出的是,我正在使用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('')
我需要别人的帮助来告诉我解决问题的方法在哪里错误,然后编辑代码。
答案 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