按字母顺序排列的最长子字符串给出了意外的输出

时间:2018-10-19 06:30:23

标签: python python-3.x

我的问题与这个封闭的问题有关-Longest substring in alphabetical order,但不正确。

这是我的python代码,用于打印String s的最长子字符串,其中字母以字母顺序出现。

s = 'azcbobobegghakl'
chow = ''
stuff = []
for e in s:
    if(s.find(e) < (len(s)-1)):     #fix indexoutofrange
       if(e <= s[s.find(e) + 1]):   #just checking the next char
           chow = chow + e          #sum up
       else:
           stuff.append(chow)
           chow = ''                # reset chow
    else:
        stuff.append(chow)          #edit

if(len(stuff)==1):
    print(stuff[0])
elif(len(stuff)==0):
    print('')
else:
    print(max(stuff,key=len))

我知道有人会在StackOverflow上找到更好的代码。但是,我的问题是为什么我没有得到代码的预期行为?


测试用例:

  • 'azcbobobegghakl'→' begg '| 'beggh'是正确的
  • 'abcbcd'→' ab '| 'abc'是正确的。
  • 'afzeolnfabcdefoooda'→' fabcdef '| 'abcdefooo'是正确的

我看到的是,最后一个字符有时没有添加,或者有时第一个字符是错误的。

请专门回答错误区域,并描述错误原因,而不是固定代码。

3 个答案:

答案 0 :(得分:3)

对于最后一个字符分配器,我认为问题在于您没有在将字符串追加到列表之前添加最后一个字符。可以通过以下修复程序解决此问题:

s = 'azcbobobegghakl'
chow = ''
stuff = []
for e in s:
    if(s.find(e) < (len(s)-1)):     #fix indexoutofrange
       if(e <= s[s.find(e) + 1]):   #just checking the next char
           chow = chow + e          #sum up
       else:
           chow = chow + e #[FIX]Add the last char before append to list
           stuff.append(chow)
           chow = ''                # reset chow

print(max(stuff,key=len))

答案 1 :(得分:2)

与其他答案一样,您也需要在出现异常时追加。但是,此外,find函数仅查找该字母的第一个实例。因此,您应该丢弃已经处理过的字符串(比用计数器单调乏味地跟踪字符串更容易)。

s = 'azcbobobegghakl'
s_working = s
chow = ''
stuff = []
for e in s:
    if(s_working.find(e) < (len(s_working)-1)):     #fix indexoutofrange
       if(e <= s_working[s_working.find(e) + 1]):   #just checking the next char
           chow = chow + e          #sum up
       else:
           chow = chow + e #[FIX]Add the last char before append to list
           stuff.append(chow)
           chow = ''                # reset chow
    s_working = s_working[1:]       # discards the already processed string
    else:
        chow = chow + e
        stuff.append(chow)

print(max(stuff,key=len))

对所有示例进行了测试,并且可以正常工作。现在针对注释示例进行了调整,并捕获了最后一个字母(如果包含的话)。

答案 2 :(得分:1)

也许这不是您要找的答案,但我前一阵子写了微笑代码。它找到按字母顺序连续的字符组。找到最长的一个很容易实现。

base_string = "afzeolnfabcdefoooda"
tmp = []
_group = []

for _index, _char in enumerate(base_string):
    try:
        _next_char =  base_string[_index + 1]

        if  _char <= _next_char:
            # add chars to list if they are alphabetically ordered
            _group.append(_char)
        else:
            # if they are not, add the char the current group, add group to list, and create an empty one
            _group.append(_char)
            tmp.append(_group)
            _group = []

    except IndexError:
        # end of the string there is no _next_char,
        # add the _char to current group and `break` the loop
        _group.append(_char)
        tmp.append(_group)
        break

结果:

[['a', 'f', 'z'], ['e', 'o'], ['l', 'n'], ['f'], ['a', 'b', 'c', 'd', 'e', 'f', 'o', 'o', 'o'], ['d'], ['a']]