在给定字符串中按字母顺序查找字母的最长子串

2024-09-30 08:38:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在为给定的任务执行代码时,我不断地获取最长的字符串加上迭代中的下一个字母。例如,如果我使用

s = 'azcbobobegghakl' 

我将得到"beggha"作为最长的字符串,而答案应该是"beggh"。我尝试过的所有随机字母字符串都会出现同样的错误。在

我已经找到了在“result+=letters”语句之后添加额外的字母,但我不确定如何修复它。这是我的代码:

^{pr2}$

Tags: 字符串答案代码错误字母语句resultletters
2条回答

你有几件事要处理。第一,当你使用。。。在

final = result

这不仅仅是将结果中的值赋给final。它将变量final指向包含“result”也指向的列表的内存地址。所以如果结果改变了,那就是最终结果。要在结果中指定,请使用。。。在

^{pr2}$

这将为您提供列表从头到尾的一个片段的值。或者你可以用。。。在

final = list(result)

更改之后,需要删除elif语句中的长度比较。在

编辑代码:

s = 'azcbobobegghakl'

result = []
final = []

for letters in s:
    result += letters
    if result == sorted(result) and len(result) >= len(final):
        final = list(result)
    elif result != sorted(result):
        result = [result[len(result)-1]]
print "".join(final)

这里的问题是resultfinal指向同一个列表。 您可能认为当您发出result += letters时,+=将创建一个新列表,但它不会:

>>> x = [1,2]
>>> y = x
>>> x += [3]
>>> x
[1, 2, 3]
>>> y
[1, 2, 3]
>>> x is y
True

但是,当您使用x = x + [3]时:

^{pr2}$

有关此行为的解释,请参见this问题。当letters是字符串中最后一个a字符时,for循环(原始代码的编辑:)中发生的情况:

  1. 在开头,final和{}都指向['b', 'e', 'g', 'g', 'h']。在
  2. result += 'a'final和{}之后都指向['b', 'e', 'g', 'g', 'h', 'a']。在
  3. 现在输入elif块,结果将指向一个新列表['a'],而final仍然指向['b', 'e', 'g', 'g', 'h', 'a']。在
  4. final之后将不再更新

因此,您的原始代码(在编辑之前)可以通过更改来修复

result += letters

result = result + [letters]

s = 'azcbobobegghakl'
result = []
final = []
for letters in s:
    result = result + [letters]        
    if result == sorted(result) and len(result) >= len(final):
        final=result            
    elif result != sorted(result):
        result = [result[len(result)-1]]        

print(final)

相关问题 更多 >

    热门问题