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

时间:2014-06-16 04:32:57

标签: python string python-2.7 substring

执行给定任务的代码时,我会继续获取最长的字符串以及迭代中的下一个字母。例如,如果我使用

s = 'azcbobobegghakl' 

当答案应为"beggha"时,我会将"beggh"作为最长的字符串。我试过的所有随机字母串都会出现同样的错误。

我已经发现在“结果+ =字母”声明后添加了额外的字母,但我不知道如何修复它。这是我的代码:

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

2 个答案:

答案 0 :(得分:2)

这里的问题是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]

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

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

  1. 一开始,finalresult都指向['b', 'e', 'g', 'g', 'h']
  2. result += 'a' finalresult之后都指向['b', 'e', 'g', 'g', 'h', 'a']
  3. 现在输入elif块,结果将指向新列表['a'],而final仍然指向['b', 'e', 'g', 'g', 'h', 'a']
  4. 在此之后,
  5. 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)
    

答案 1 :(得分:1)

您有几件要解决的问题。首先是当你使用...时

final = result

这不仅仅是将结果中的值分配给final。它指出变量' final'到包含'结果'的列表的内存地址也指着。那么如果结果发生变化,那么最终结果也是如此。要在结果中指定,请使用...

final = result[:]

将从头到尾为您提供列表片段的值。或者你可以使用......

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)