查找最长的字母顺序子字符串-理解Python中的概念
我正在完成计算机科学和使用Python编程的入门课程,我被困在第1周:Python基础-习题集1-习题3 问题是: 假设s是一个小写字符字符串 编写一个程序,打印其中 字母按字母顺序排列。例如,如果查找最长的字母顺序子字符串-理解Python中的概念,python,for-loop,concept,Python,For Loop,Concept,我正在完成计算机科学和使用Python编程的入门课程,我被困在第1周:Python基础-习题集1-习题3 问题是: 假设s是一个小写字符字符串 编写一个程序,打印其中 字母按字母顺序排列。例如,如果s='azcbobobegbegghakl',那么您的程序应该打印 按字母顺序排列的最长子字符串是:beggh 如果是领带,请打印第一个子字符串。例如,如果s='abcbcd',那么您的程序应该打印* 按字母顺序排列的最长子字符串为:abc 在StackOverflow上有很多帖子,人们只是在追逐或给
s='azcbobobegbegghakl'
,那么您的程序应该打印
按字母顺序排列的最长子字符串是:beggh
如果是领带,请打印第一个子字符串。例如,如果s='abcbcd'
,那么您的程序应该打印*
按字母顺序排列的最长子字符串为:abc
在StackOverflow上有很多帖子,人们只是在追逐或给出代码作为答案。我希望了解代码背后的概念,因为我是编程新手,希望更好地理解基础知识
我发现下面的代码似乎可以回答这个问题。我理解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)
让我们一步一步地检查您的代码 首先,我们假设第一个字符构成最长的序列。我们要做的是改进这个猜测
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)
s='cyqfjhclkbxpbojgkar'
子字符串=[]
开始=0
结束=1
当结束时s[end]:
substring.append(s[start:end])
开始=结束+1
结束=开始+1
其他:
结束+=1
lstring=max(子字符串,键=len)
打印(“按字母顺序排列的最长子字符串为:“+lstring”)
在while循环之后,列表的子字符串如下所示:['cy','fj','ccl','bx','bo','gk']
从这些代码中,
max(…,key=len)
选择最长的一个。让我们一步一步地检查您的代码
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)
首先,我们假设第一个字符构成最长的序列。我们要做的是改进这个猜测
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)
s='cyqfjhclkbxpbojgkar'
子字符串=[]
开始=0
结束=1
当结束时s[end]:
substring.append(s[start:end])
开始=结束+1
结束=开始+1
其他:
结束+=1
lstring=max(子字符串,键=len)
打印(“按字母顺序排列的最长子字符串为:“+lstring”)
在while循环之后,列表的子字符串如下所示:['cy','fj','ccl','bx','bo','gk']
从中,
max(…,key=len)
选择最长的一个。谢谢@olivierm。您的清晰解释帮助我理解了嵌套循环和比较在做什么。为奥利维耶姆干杯。您的清晰解释帮助我理解了嵌套循环和比较在做什么。干杯
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)