尝试查找最长子字符串的长度时遇到问题
Trouble trying to find length of longest substring
我写了下面的代码。它应该 return 对我来说是字符串中最长下标的长度,没有字母重复。
def lengthOfLongestSubstring(s):
lst = []
y = 0
final = 0
count = len(s)
while len(s) > 0:
s = s[y:]
for i in range(len(s)):
if s[i] in lst:
y += 1
count = len(lst)
lst =[]
break
else:
lst.append(s[i])
if count > final:
final=count
return(final)
当输入字符串“tmmzuxt”时,我希望得到 5 的输出(“mzuxt”的长度),但却得到 4。我已经调试找出问题似乎是我的函数跳过了第二个'm' 索引时,但我不明白为什么。有什么建议吗?
意识到我不知何故错过了一行。希望这更有意义。
我不确定我是否理解你的代码,或者实际上这里是否需要 while
循环。试试这个:
def lengthOfLongestSubstring(s):
max_length = 0
length = 0
previous = ''
for thisCharacter in s:
if thisCharacter != previous:
length += 1
else:
max_length = max(length, max_length)
length = 1
return max_length
这是经过编辑的代码。删除#lst =[]
和#break
行。
[代码]
def lengthOfLongestSubstring(s):
lst = []
y = 0
final = 0
count = len(s)
while len(s) > 0:
s = s[y:]
for i in range(len(s)):
if s[i] in lst:
y += 1
count = len(lst)
#lst =[]
#break
else:
lst.append(s[i])
if count > final:
final=count
return(final)
s="tmmzuxt"
print(lengthOfLongestSubstring(s))
[输出]
5
您的代码的主要问题是您增加了 y,即使它应该只删除第一个字符。不需要变量 y。试试这个:
def lengthOfLongestSubstring(s):
final = 0
while len(s) > 0:
count = len(s)
lst = []
for i in range(len(s)):
if s[i] in lst:
count = i - 1
break
lst.append(s[i])
if count > final:
final = count
s = s[1:]
return final
print(lengthOfLongestSubstring("tmmzuxt"))
你的问题是你在修改 s
而你是 运行 你的代码。
考虑到在第一次迭代中,您得到 s = s[0:]
,因此 s
现在将是 'tmmzuxt'
。在您的下一次迭代中,您将从修改后的 s
中获得 s = s[1:]
。这仍然不是问题,因为你刚好得到 'mmzuxt'
。但是,在您的第三次迭代中,您得到 s = s[2:]
,现在是 'zuxt'
。
所以你需要一个不同于 s
的变量来保存你实际测试的 s
的子字符串。
这里,在您的代码(第 7 行)中,每次您的 for 循环迭代时,您都在函数内部更新字符串值。
例如,在 for 循环内的每个 break 之后。你的字符串(就是“tmmzuxt”)越来越短了。
我创建了一个包含您的原始字符串的新变量。
def lengthOfLongestSubstring(s):
lst = []
y = 0
final = 0
count = len(s)
main_string = s;#change done here
while len(s) > 0:
s = main_string[y:] #change done here
for i in range(len(s)):
if s[i] in lst:
y += 1
count = len(lst)
lst =[]
break
else:
lst.append(s[i])
if count > final:
final =count
print(final)
return(final)
lengthOfLongestSubstring("tmmzuxt")
我写了下面的代码。它应该 return 对我来说是字符串中最长下标的长度,没有字母重复。
def lengthOfLongestSubstring(s):
lst = []
y = 0
final = 0
count = len(s)
while len(s) > 0:
s = s[y:]
for i in range(len(s)):
if s[i] in lst:
y += 1
count = len(lst)
lst =[]
break
else:
lst.append(s[i])
if count > final:
final=count
return(final)
当输入字符串“tmmzuxt”时,我希望得到 5 的输出(“mzuxt”的长度),但却得到 4。我已经调试找出问题似乎是我的函数跳过了第二个'm' 索引时,但我不明白为什么。有什么建议吗?
意识到我不知何故错过了一行。希望这更有意义。
我不确定我是否理解你的代码,或者实际上这里是否需要 while
循环。试试这个:
def lengthOfLongestSubstring(s):
max_length = 0
length = 0
previous = ''
for thisCharacter in s:
if thisCharacter != previous:
length += 1
else:
max_length = max(length, max_length)
length = 1
return max_length
这是经过编辑的代码。删除#lst =[]
和#break
行。
[代码]
def lengthOfLongestSubstring(s):
lst = []
y = 0
final = 0
count = len(s)
while len(s) > 0:
s = s[y:]
for i in range(len(s)):
if s[i] in lst:
y += 1
count = len(lst)
#lst =[]
#break
else:
lst.append(s[i])
if count > final:
final=count
return(final)
s="tmmzuxt"
print(lengthOfLongestSubstring(s))
[输出]
5
您的代码的主要问题是您增加了 y,即使它应该只删除第一个字符。不需要变量 y。试试这个:
def lengthOfLongestSubstring(s):
final = 0
while len(s) > 0:
count = len(s)
lst = []
for i in range(len(s)):
if s[i] in lst:
count = i - 1
break
lst.append(s[i])
if count > final:
final = count
s = s[1:]
return final
print(lengthOfLongestSubstring("tmmzuxt"))
你的问题是你在修改 s
而你是 运行 你的代码。
考虑到在第一次迭代中,您得到 s = s[0:]
,因此 s
现在将是 'tmmzuxt'
。在您的下一次迭代中,您将从修改后的 s
中获得 s = s[1:]
。这仍然不是问题,因为你刚好得到 'mmzuxt'
。但是,在您的第三次迭代中,您得到 s = s[2:]
,现在是 'zuxt'
。
所以你需要一个不同于 s
的变量来保存你实际测试的 s
的子字符串。
这里,在您的代码(第 7 行)中,每次您的 for 循环迭代时,您都在函数内部更新字符串值。 例如,在 for 循环内的每个 break 之后。你的字符串(就是“tmmzuxt”)越来越短了。
我创建了一个包含您的原始字符串的新变量。
def lengthOfLongestSubstring(s):
lst = []
y = 0
final = 0
count = len(s)
main_string = s;#change done here
while len(s) > 0:
s = main_string[y:] #change done here
for i in range(len(s)):
if s[i] in lst:
y += 1
count = len(lst)
lst =[]
break
else:
lst.append(s[i])
if count > final:
final =count
print(final)
return(final)
lengthOfLongestSubstring("tmmzuxt")