Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按字母顺序排列的最长字符串_Python_Python 2.7 - Fatal编程技术网

Python 按字母顺序排列的最长字符串

Python 按字母顺序排列的最长字符串,python,python-2.7,Python,Python 2.7,此代码适用于所有字符串,但需要最后一个字符的字符串除外 s='abcdefghijklmnopqrstuvwxyz' sub ='' test =s[0] for n in range(len(s)-1): if len(test) > len(sub): sub = test if s[n] >= s[n-1]: test += s[n] else: test = s[n] print 'Longest s

此代码适用于所有字符串,但需要最后一个字符的字符串除外

s='abcdefghijklmnopqrstuvwxyz'
sub =''
test =s[0]

for n in range(len(s)-1):
    if len(test) > len(sub):
        sub = test
    if s[n] >= s[n-1]:
        test += s[n]
    else:
        test = s[n]

print 'Longest substring in alphabetic order is: ' + str(sub) 

你如何建议这样做的可能性

提前谢谢大家

附言:

谢谢你迄今为止的回答。问题是,无论我键入哪个范围,我将打印的子变量都不能得到我想要的所有字符。循环在以下时间之前完成:\n可能是程序本身有问题


有额外的提示吗?:)

您的问题在于
范围(len(s)-1)
。“范围”生成一个上限参数值为-1的列表,因此不需要将1减去len,使用:

范围(停止) 范围(开始、停止[步进]) 这是一个多功能函数,用于创建包含算术级数的列表。它最常用于for循环。这些论点必须是正确的 必须是纯整数。如果省略步骤参数,则默认为1。 如果省略start参数,则默认为0。完整表格 返回纯整数列表[start,start+step,start+2]* 步骤,…]。如果步骤为正,则最后一个元素是最大的起点 +i*比停止少一步;如果步长为负值,则最后一个元素是大于停止的最小开始+i*步长。阶跃不得为零

另一方面,您将问题标记为python2.7,因此我假设您使用的是2.7。如果是这种情况,则使用
xrange
而不是
range
更有效,因为这样您将使用迭代器而不是生成列表

编辑

从对该问题的评论中,您可以将代码更改为:

s='caabcdab'
sub =''
test =s[0]

for i in range(1,len(s)+1):
    n = i%len(s)
    if len(test) > len(sub):
        sub = test
        if i >= len(s):
            break
    if s[n] >= s[n-1]:
        test += s[n]
    else:
        test = s[n]

print 'Logest substring in alphabetic order is: ' + str(sub)

您可以
enemurate
而不是范围:

 s='abcdefghijklmnopqrstuvwxyz'

sub =''
test =s[0]

for n,value in enumerate(s):
    if len(test) > len(sub):
        sub = test
    if value >= s[n-1]:
        test += s[n]
    else:
        test = s[n]

您可以使用以下代码:

s = 'abcdefgahijkblmnopqrstcuvwxyz'
sub = ''
test = s[0]

for index, character in enumerate(s):
    if index > 0:
        if character > s[index - 1]:
            test += character
        else:
            test = character
    if len(test) > len(sub):
        sub = test
print 'Longest substring in alphabetic order is: ' + str(sub)
还有几点建议

  • Python字符串是可编辑的。i、 你可以在它们之间循环
  • 在迭代列表时需要列表的索引时,请使用enumerate

  • 另外,在
    print'Logest substring…
    中有一个打字错误,它应该是
    最长的
    (如标题中所示)/吹毛求疵谢谢你的回答,巴勃罗。问题是,无论我键入哪个范围,我将打印的子变量都不能得到我想要的所有字符。循环在以下时间之前完成:\n可能是程序本身有问题。@makemesteaks:这是因为您在sub完成循环中的检查之前将测试分配给了它。因此,最后一次检查成功,但更新的字符串未分配给sub.:)@makemesteaks您的算法需要迭代到多个字符才能分配最后的结果。尝试:
    对于范围内的i(len)+1):n=i%len(s)
    谢谢Rajan!检查我下面的答案。我刚刚将检查分配到循环的末尾,现在我将检查不同的情况,我将为您更新工作人员的感谢。如果我将
    If len(test)>len(sub):sub=test
    移动到循环的末尾,它也不起作用。另外,您的编辑代码不适用于其他一些测试用例,例如:s='ocunhyfwiyizqh'应该是cu,而我得到oo。对不起,伙计们,但这已经成为一件让人头疼的事了。
    s = 'abcdefgahijkblmnopqrstcuvwxyz'
    sub = ''
    test = s[0]
    
    for index, character in enumerate(s):
        if index > 0:
            if character > s[index - 1]:
                test += character
            else:
                test = character
        if len(test) > len(sub):
            sub = test
    print 'Longest substring in alphabetic order is: ' + str(sub)