如何在python中获得字母顺序最长的子字符串

时间:2016-09-16 18:29:37

标签: python-3.x alphabetical-sort

我正在尝试编写一个函数,该函数返回s的最长子字符串,其中字母按字母顺序出现。例如,如果s = 'azcbobobegghakl',该函数应返回' beggh'

这是我的函数,它仍然不完整,但它不返回sub列表; 返回错误是:

  

" IndexError:字符串索引超出范围"

def longest_substring(s):
    sub=[]
    for i in range (len(s)-1):
        subs=s[i]
        counter=i+1
        while ord(s[i])<ord(s[counter]):
            subs+=s[counter] 
            counter+=1
        sub.append(subs)
    return sub

1 个答案:

答案 0 :(得分:3)

它不是最优的(在线性时间 O(n)中工作)但我对你的代码进行了一些修改(在Python 3中):

def longest_substring(s):
    length = len(s)
    if length == 0 :         # Empty string
        return s
    final = s[0]
    for i in range (length-1):
        current = s[i]
        counter = i+1
        while counter < length and ord(s[i]) <= ord(s[counter]):  
            current += s[counter] 
            counter +=1
            i+=1
        if len(final) < len(current):
            final = current
    return final
s = 'azcbobobegghakl'
print(longest_substring(s))

输出:

beggh
  

<强>修改:

     
      
  • 您正在将字符与固定位置进行比较,即在while循环中,您只递增counter而不是i,所以我增加了   第i个位置也是。(所以我们避免检查已经检查过的字符,所以它在线性时间O(n)中这样做我认为..)
  •   
  • 此外,你只是检查条件while ord(s[i])<ord(s[counter]):,但你也必须检查等于。
  •   
  • 您创建了一个list,其中您附加了每个不必要的序列,除非您想要对其进行任何其他计算   顺序,所以我采用string并且前一序列的长度很小   然后我用新序列更新了它。
  •   

注意:如果两个序列的长度相同,那么第一个出现的序列将显示为输出。

另一个输入:

s = 'acdb'

输出:

acd

我希望这会对你有所帮助。