编辑:我知道在 SO 中已经提出了类似任务的问题,但我有兴趣找出这段特定代码中的问题。我也知道这个问题可以在不使用递归的情况下解决。
任务是编写一个程序,该程序将找到(并打印)其中字母按字母顺序出现的最长子字符串。如果发现超过 1 个相同长度的序列,则应打印第一个。例如,字符串的输出abczabcd将是abcz.
我已经用递归解决了这个问题,似乎通过了我的手动测试。但是,当我运行生成随机字符串的自动化测试集时,我注意到在某些情况下,输出不正确。例如:
如果,则s = 'hixwluvyhzzzdgd'输出是hixluvy
如果,则s = 'eseoojlsuai'输出是eoojlsu
如果,则s = 'drurotsxjehlwfwgygygxz'输出是druehlw
经过一段时间的挣扎,我无法弄清楚这些导致错误的字符串有什么特别之处。
这是我的代码:
pos = 0
maxLen = 0
startPos = 0
endPos = 0
def last_pos(pos):
    if pos < (len(s) - 1):
        if s[pos + 1] >= s[pos]:
            pos += 1
            if pos == len(s)-1:
                return len(s)
            else:
                return last_pos(pos)
        return pos
for i in range(len(s)):
    if last_pos(i+1) != None:
        diff = last_pos(i) - i
    if diff - 1 > maxLen:
        maxLen = diff
        startPos = i
        endPos = startPos + diff
print s[startPos:endPos+1]