我正在尝试编写一个函数,该函数返回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
答案 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
我希望这会对你有所帮助。