需要编写一个程序打印变量的最长子串,其中字母按字母顺序出现。
例如。 s = 'onsjdfjqiwkvftwfbx'
,它应该返回'dfjq'
。
初学者,代码如下:
y=()
z=()
for i in range(len(s)-1):
letter=s[i]
while s[i]<=s[i+1]:
letter+=s[i+1]
i+=1
y=y+(letter,)
z=z+(len(letter),)
print(y[z.index(max(z))])
但是,上面的代码总是会返回
IndexError: string index out of range.
它将产生所需的结果,直到我将其更改为 range(len(s)-3)
。
想寻求建议:
为什么
range(len(s)-1)
会出现这样的错误信息?为了处理直到 i+1 的索引,我已经将范围值减 1。 我的理由是,如果变量 s 的长度是 14,它的索引是 0-13,range(14) 产生值 0-13。然而,由于我的代码涉及 i+1 索引,范围减少 1 以处理这部分。如何修改以上代码以产生正确的结果。 如果
s = 'abcdefghijklmnopqrstuvwxyz'
,上面带有 range(len(s)-3) 的代码再次返回IndexError: string index out of range
。为什么?这段代码有什么问题?
感谢任何帮助~
最佳答案
索引超出范围的原因是,在您的内部 while
循环中,您正在推进 i
而没有检查其范围。您的代码也非常低效,因为您有嵌套循环,并且您正在做很多相对昂贵的字符串连接。没有连接的线性时间算法看起来像这样:
s = 'onsjdfjqiwkvftwfbcdefgxa'
# Start by assuming the longest substring is the first letter
longest_end = 0
longest_length = 1
length = 1
for i in range(1, len(s)):
if s[i] > s[i - 1]:
# If current character higher in order than previous increment current length
length += 1
if length > longest_length:
# If current length, longer than previous maximum, remember position
longest_end = i + 1
longest_length = length
else:
# If not increasing order, reset current length
length = 1
print(s[longest_end - longest_length:longest_end])
关于python - 当我考虑到索引范围时,总是有这个错误 'IndexError: string index out of range',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62487046/