在较长的字符串中查找最长的字母子字符串

时间:2016-09-13 21:18:06

标签: python string alphabetical

此代码查找字符串中最长的字母子字符串(s)。

letter = s[0]      
best = ''          
for n in range(1, len(s)):    
    if len(letter) > len(best):
        best = letter
    if s[n] >= s[n-1]:
        letter += s[n]    
    else:                      
        letter = s[n]

它大部分时间都有效,但偶尔会给出错误的答案,我很困惑为什么它有时只能起作用。例如:

  

S = 'maezsibmhzxhpprvx'

它说答案是“hpprv”,而它应该是“hpprvx”。

在另一种情况下,何时

  

S = 'ysdxvkctcpxidnvaepz'

它给出了答案“cpx”,它应该是“aepz”。

任何人都可以理解为什么会这样做吗?

3 个答案:

答案 0 :(得分:3)

您应该移动此支票

if len(letter) > len(best):
    best = letter
在循环的其余部分之后

答案 1 :(得分:1)

逻辑几乎没有问题,只是如果letter在最后一次循环迭代(n == len(s) - 1)上增长,best最后一次没有改变。您可以在循环后插入另一个best = letter部分,或者仔细考虑程序结构,这样您就不会重复了。

答案 2 :(得分:1)

你的日常工作几乎没问题,这里有你们之间的一点比较,固定的和你可能解决的问题:

def buggy(s):
    letter = s[0]
    best = ''
    for n in range(1, len(s)):
        if len(letter) > len(best):
            best = letter
        if s[n] >= s[n - 1]:
            letter += s[n]
        else:
            letter = s[n]

    return best


def fixed(s):
    letter = s[0]
    best = ''
    for n in range(1, len(s)):
        if s[n] >= s[n - 1]:
            letter += s[n]
        else:
            letter = s[n]

        if len(letter) > len(best):
            best = letter

    return best


def alternative(s):
    result = ['' for i in range(len(s))]
    index = 0

    for i in range(len(s)):
        if (i == len(s) - 1 and s[i] >= s[i - 1]) or s[i] <= s[i + 1]:
            result[index] += s[i]
        else:
            result[index] += s[i]
            index += 1

    return max(result, key=len)


for sample in ['maezsibmhzxhpprvx', 'ysdxvkctcpxidnvaepz']:
    o1, o2, o3 = buggy(sample), fixed(sample), alternative(sample)
    print "buggy={0:10} fixed={1:10} alternative={2:10}".format(o1, o2, o3)

正如您在版本中看到的,内部循环条件的顺序不好,您应该将第一个条件移动到循环结束。