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