如何在Python中打印给定字符串的最长字母子字符串?

时间:2017-10-30 23:42:05

标签: python string

我是一般的编码新手,并且一直在通过edX平台进行学习。第一个作业之一要求我们编写一段代码,打印给定字符串中最长的字母子字符串。

我试过在互联网上到处寻找,但我能找到的只是固定的答案,而不是为什么我的代码不起作用。我希望找到一些帮助来弄清楚原因,因为它在我脑海中是有意义的。

代码:

s = 'abcdszabc'
start = 0
end = 0
a = ''
b = ''

while len(b) < len(s[start:]):
    while s[end] <= s[end+1]:
        end += 1
    a = s[start:end+1]
    if a > b:
        b = a
    print(b)
    start += 1
    end = start

当我运行它时,检索声明的错误:

while s[end] <= s[end+1]:
    IndexError: string index out of range

没有意义,因为第一次应该在进入第二次之前评估b字符串的大小。在我的情况下,b将在第一次尝试时被分配'abcdsz',并且当剩下少于6个字符时,程序应该在第一次停止循环(因为没有进一步搜索的点)。

任何人都可以在不给我直接解决方案的情况下开导我吗?我正尽力在没有破坏者的情况下自己解决它!

1 个答案:

答案 0 :(得分:1)

将基本跟踪应用于您的代码......

while len(b) < len(s[start:]):
    print ("WHILE 1", s, end)
    while s[end] <= s[end+1]:
        end += 1
        print ("WHILE 2", s, end)
    a = s[start:end+1]
    if a > b:
        b = a
    print("RESULT", b)
    start += 1
    end = start

输出:

WHILE 1 abcdszabc 0
WHILE 2 abcdszabc 1
WHILE 2 abcdszabc 2
WHILE 2 abcdszabc 3
WHILE 2 abcdszabc 4
WHILE 2 abcdszabc 5
RESULT abcdsz
WHILE 1 abcdszabc 1
WHILE 2 abcdszabc 2
WHILE 2 abcdszabc 3
WHILE 2 abcdszabc 4
WHILE 2 abcdszabc 5
RESULT bcdsz
WHILE 1 abcdszabc 2
WHILE 2 abcdszabc 3
WHILE 2 abcdszabc 4
WHILE 2 abcdszabc 5
RESULT cdsz
WHILE 1 abcdszabc 3
WHILE 2 abcdszabc 4
WHILE 2 abcdszabc 5
RESULT dsz
WHILE 1 abcdszabc 4
WHILE 2 abcdszabc 5
RESULT sz
WHILE 1 abcdszabc 5
RESULT z
WHILE 1 abcdszabc 6
WHILE 2 abcdszabc 7
WHILE 2 abcdszabc 8
Traceback (most recent call last):
  File "so.py", line 9, in <module>
    while s[end] <= s[end+1]:
IndexError: string index out of range

它是:end是8,所以end+1是9.指数对于9个字符的字符串仅运行0-8。当您检查的子字符串按字母顺序排列时,您无法控制搜索从右端开始运行。