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

Python 在较长字符串中查找最长的字母顺序子字符串,python,string,alphabetical,Python,String,Alphabetical,此代码查找字符串中最长的字母顺序子字符串(s) 它在大多数情况下都有效,但偶尔会给出错误的答案,我很困惑为什么它只是有时有效。例如: s='Maezsibmhzxhprpvx' 它说答案是“hpprv”,而它应该是“hpprvx” 在另一种情况下,当 s='ysdxvkctcpxidnvaepz' 它给出的答案是“cpx”,而它本应该是“aepz” 有人能理解它为什么这样做吗?你应该移动这张支票 if len(letter) > len(best): best = letter

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

它在大多数情况下都有效,但偶尔会给出错误的答案,我很困惑为什么它只是有时有效。例如:

s='Maezsibmhzxhprpvx'

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

在另一种情况下,当

s='ysdxvkctcpxidnvaepz'

它给出的答案是“cpx”,而它本应该是“aepz”


有人能理解它为什么这样做吗?

你应该移动这张支票

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

在循环的其余部分之后

您应该移动此复选框

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

在循环的其余部分之后,逻辑几乎没有问题,除了如果
字母
在最后一次循环迭代中增长(当
n==len(s)-1
时,
最佳
上次没有改变。您可以在循环后插入另一个
best=letter
部分,或者重新仔细考虑程序结构,这样您就不会重复自己的操作。

逻辑基本正常,但如果
letter
在上一次循环迭代中增长(当
n==len(s)-1
时,
best
上次不会更改。您可以在循环后插入另一个
best=letter
部分,或者重新仔细考虑程序结构,这样您就不会重复自己的操作了。

您的例行程序基本正常,下面是您的一个小比较,它是解决问题的固定方案和另一个可能的解决方案:

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)
def小车:
字母=s[0]
最佳=“”
对于范围(1,len)中的n:
如果len(字母)>len(最佳):
最佳=字母
如果s[n]>=s[n-1]:
字母+=s[n]
其他:
字母=s[n]
回报最好
def已修复:
字母=s[0]
最佳=“”
对于范围(1,len)中的n:
如果s[n]>=s[n-1]:
字母+=s[n]
其他:
字母=s[n]
如果len(字母)>len(最佳):
最佳=字母
回报最好
def替代方案:
结果=[''对于范围内的i(len(s))]
索引=0
对于范围内的i(len(s)):

如果(i==len(s)-1和s[i]>=s[i-1])或s[i]您的例行程序基本正常,下面是您的、固定的和您问题的另一种可能解决方案之间的比较:

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)
def小车:
字母=s[0]
最佳=“”
对于范围(1,len)中的n:
如果len(字母)>len(最佳):
最佳=字母
如果s[n]>=s[n-1]:
字母+=s[n]
其他:
字母=s[n]
回报最好
def已修复:
字母=s[0]
最佳=“”
对于范围(1,len)中的n:
如果s[n]>=s[n-1]:
字母+=s[n]
其他:
字母=s[n]
如果len(字母)>len(最佳):
最佳=字母
回报最好
def替代方案:
结果=[''对于范围内的i(len(s))]
索引=0
对于范围内的i(len(s)):

如果(i==len(s)-1和s[i]>=s[i-1])或s[i]您的代码运行得非常好,并具有预期的输出。它运行,但@EllaP清楚地说它有时并没有达到预期的效果。如果您看到下面的修复答案,它显然并不总是具有预期的输出。您的代码运行得非常好,并具有预期的输出。它运行,但是@ EllaP清楚地说,它有时不做预期的事情。如果你看到下面的答案与修复,它显然并不总是有预期的输出。此外,你可能要考虑的情况下,你有多个最长字母的子串……你只是想选择第一个你遇到?这将真正取决于你的应用,但值得考虑你想如何处理这种情况。绝对。最重要的是,我重新阅读了这个问题,我只是觉得这个程序实际上并不关心子串的字母顺序。此外,你可能要考虑你有多个最长的字母串的情况……你想选择你遇到的第一个吗?这将真正取决于你的应用,但值得考虑你想如何处理这种情况。绝对。除此之外,我重新阅读了这个问题,我只是认为程序实际上并不关心子字符串的字母顺序。