我正在完成计算机科学和使用Python编程的介绍课程,并坚持在第1周:Python基础-问题集1-问题3。在
问题是:
Assume s is a string of lower case characters.
Write a program that prints the longest substring of s in which the letters occur in alphabetical order. For example, if
s = 'azcbobobegghakl'
, then your program should printLongest substring in alphabetical order is: beggh
In the case of ties, print the first substring. For example, if
s = 'abcbcd'
, then your program should print*Longest substring in alphabetical order is: abc
有很多关于堆栈溢出的帖子,人们只是在追逐或者给出代码作为答案。我正在寻找理解的概念背后的代码,因为我是新的编程和希望获得一个更好的理解的基础
我发现下面的代码似乎可以回答这个问题。我了解for循环的基本概念,我很难理解如何使用它们(for循环)来查找字符串中的字母序列
有人能帮我理解一下这样使用for循环的概念吗。在
s = 'cyqfjhcclkbxpbojgkar'
lstring = s[0]
slen = 1
for i in range(len(s)):
for j in range(i,len(s)-1):
if s[j+1] >= s[j]:
if (j+1)-i+1 > slen:
lstring = s[i:(j+1)+1]
slen = (j+1)-i+1
else:
break
print("Longest substring in alphabetical order is: " + lstring)
让我们一步一步地检查你的代码。在
首先,我们假设第一个字符构成最长的序列。我们要做的是尝试改进这个猜测。在
第一个循环然后选择某个索引
^{pr2}$i
,它将是序列的开始。从这里开始,我们将检查从i
开始的所有现有序列,方法是用嵌套循环遍历序列的可能结尾。在这个嵌套循环允许我们通过选择}的每个组合来检查每个子序列。在
i
和{第一个if语句打算检查该序列是否仍然是递增序列。如果不是这样的话,我们就打破内部循环,因为我们对这个序列不感兴趣。在
最后,我们需要通过将当前序列的长度与
slen
进行比较来检查当前序列是否比我们当前的猜测更好,这是我们的最佳猜测。在改进
注意,这段代码不是最佳的,因为它不必要地多次遍历字符串。您可以实现一种更有效的方法,只遍历字符串一次以恢复所有递增的子字符串,然后使用
max
来选择最长的子字符串。在在while循环之后,列表
substrings
如下所示:['cy', 'fj', 'ccl', 'bx', 'bo', 'gk']
从中,
max(..., key=len)
选择最长的一个。在相关问题 更多 >
编程相关推荐