我正在完成计算机科学入门和使用Python课程编程,我被困在第1周:Python基础知识 - 问题集1 - 问题3。
问题是:
假设s是一个小写字符串。
编写一个打印s的最长子串的程序 字母按字母顺序排列。例如,如果
s = 'azcbobobegghakl'
,那么您的程序应该打印按字母顺序排列的最长子字符串是:beggh
在tie的情况下,打印第一个子字符串。例如,如果
s = 'abcbcd'
,则您的程序应打印*按字母顺序排列的最长子字符串是: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)
答案 0 :(得分:2)
让我们一步一步完成您的代码。
首先,我们假设第一个字符形成最长的序列。我们要做的是尝试改进这种猜测。
s = 'cyqfjhcclkbxpbojgkar'
lstring = s[0]
slen = 1
第一个循环然后选择一些索引i
,它将是一个序列的开始。从那里,我们将通过使用嵌套循环遍历序列的可能末尾来检查从i
开始的所有现有序列。
for i in range(len(s)): # This loops over the whole string indices
for j in range(i,len(s)-1): # This loops over indices following i
这个嵌套循环允许我们通过选择i
和j
的每个组合来检查每个子序列。
第一个if语句打算检查该序列是否仍在增加。如果不是,我们打破内循环,因为我们对该序列不感兴趣。
if s[j+1] >= s[j]:
...
else:
break
我们最后需要通过将其长度与slen
进行比较来检查我们正在查看的当前序列是否优于我们当前的猜测,这是我们最好的猜测。
if (j+1)-i+1 > slen:
lstring = s[i:(j+1)+1]
slen = (j+1)-i+1
请注意,此代码不是最佳的,因为它会不必要地遍历您的字符串多次。您可以实现一种更有效的方法,只遍历字符串一次以恢复所有增加的子字符串,然后使用max
来选择最长的子字符串。
s = 'cyqfjhcclkbxpbojgkar'
substrings = []
start = 0
end = 1
while end < len(s):
if s[end - 1] > s[end]:
substrings.append(s[start:end])
start = end + 1
end = start + 1
else:
end += 1
lstring = max(substrings, key=len)
print("Longest substring in alphabetical order is: " + lstring)
列表substrings
在while-loop之后看起来像这样:['cy', 'fj', 'ccl', 'bx', 'bo', 'gk']
从这些中,max(..., key=len)
选择最长的。