2

我正在做的练习的重点是编写一个程序,打印s其中字母按字母顺序出现的最长子字符串。例如,如果s = 'azcbobobegghakl',那么您的程序应该打印:

按字母顺序排列的最长子串是:beggh

在平局的情况下,打印第一个子字符串。例如,如果s = 'abcbcd',那么您的程序应该打印:

按字母顺序排列的最长子串是:abc

我已经运行了测试,它适用于我输入的大多数字符串,但是这个是有问题的。

在第15步,它应该比较2 > 0哪个是真的,但它没有执行,有人可以解释一下吗?我在哪里犯错?

我的代码如下所示:

s = 'zodworqozid'
curstring = [0]
longest = [0]
for i in range(1,len(s)):
    if s[i] >= str(curstring[-1]):
        curstring+= s[i]
        if len(curstring) > len(longest):
            longest = curstring
    else:
        curstring = s[i]

print('Longest substring in alphabetical order is:', longest)

我正在使用 python 导师来帮助可视化步骤

4

3 回答 3

0

错误 1:

curstring = [0]

您需要curstring使用 in 中的第一个字符s(而不是包含 integer 的列表0)来初始化您的。我看到您已经知道如何在代码中执行此操作。(即s[0])这是为了让您的后续代码正确地将下一个字符与s.

错误 2:

longest = [0]

您将希望初始化longest为一个空列表 str(即"")而不是list包含整数0。这是因为您不需要列表功能,longest因为您直接返回str.

错误 3:

longest = curstring

您需要制作副本curstring而不是链接longestcurstring. list(curstring)使用或执行此操作curstring[:]这里没有错误。当它是a 时,我误读curstring为a 。liststr

于 2017-02-14T09:32:31.403 回答
0

这里:

curstring = [0]
longest = [0]

您正在创建两个列表,其中一个元素是整数 (0)。

后来,这里:

if s[i] >= str(curstring[-1]):

您正在检查给定字母的值是否高于列表中的最后一个元素。由于 Python 是从零开始的,因此您从字母 'o' 开始(因为它的索引为 1,恰好是范围列表中的第一个)。

for i in range(1,len(s)):

字符(字母)比较基于ASCII 表,因此给定的任何字母都将具有比 0('o' 为 111)“更高的值”。

因为第二个代码块的条件为真,所以字母 'o' 被添加到此块的列表中:

curstring+= s[i]

之后,列表curstring上有两个元素:0 和 'o'。

if len(curstring) > len(longest):

在这里,您正在比较curstring(如上所述)和最长的列表,它是一个包含一个元素的列表:0(因为您在上面描述的第一个代码块中创建了一个包含一个元素的列表)。条件为真(2 个元素不止一个元素),因此最长现在指向与curstring相同的列表,因此有两个元素(并且长度 = 2)。

稍后,正如您在提供的可视化工具中看到的那样,curstring引用变量并不指向列表。执行此行时更改其类型:

curstring = s[i]

所以后来,当添加一个字符时,当执行 15. 步骤时,结果是一个两个字母的字符串“dw”。该字符串与具有两个元素的最长列表进行比较(如上所述)。字符串“dw”的长度为 2,列表的长度为 2,这就是条件为假的原因。

您应该阅读一些关于 Python 中的类型以及如何在代码中创建和维护变量的信息——这将帮助您发现那些小错误。请记住,Python 在列表方面的语法与 C++ 或 Java 等语言不同 - 我假设您已经编写了该代码

curstring = [0]
longest = [0]

基于对其他语言的数组/列表的经验。Python中的空列表是这样创建的:

new_list = []
于 2017-02-14T09:40:43.290 回答
0

我不确定您所说的“在第 15 步,它应该比较 2>0,这是真的,但它没有执行,有人可以解释一下吗?我在哪里犯了错误?”。但是看看你的代码,

curstring = [0]
if s[i] >= str(curstring[-1]):

这两个语句的意思是当 i==1 时,Condition s[i] >= str(curstring[-1]) 总是为真,这在 s[1] 时是不对的

纠正它。将 curstring 的初始值设置为 s[0],“curstring = s[0]”将起作用。还有一个建议。我认为“如果 s[i]>= s[i-1]”更具可读性。

希望这会有所帮助。

于 2017-02-14T09:52:17.573 回答