查找最长的字母顺序子字符串-理解Python中的概念

查找最长的字母顺序子字符串-理解Python中的概念,python,for-loop,concept,Python,For Loop,Concept,我正在完成计算机科学和使用Python编程的入门课程,我被困在第1周:Python基础-习题集1-习题3 问题是: 假设s是一个小写字符字符串 编写一个程序,打印其中 字母按字母顺序排列。例如,如果s='azcbobobegbegghakl',那么您的程序应该打印 按字母顺序排列的最长子字符串是:beggh 如果是领带,请打印第一个子字符串。例如,如果s='abcbcd',那么您的程序应该打印* 按字母顺序排列的最长子字符串为:abc 在StackOverflow上有很多帖子,人们只是在追逐或给

我正在完成计算机科学和使用Python编程的入门课程,我被困在第1周:Python基础-习题集1-习题3

问题是:

假设s是一个小写字符字符串

编写一个程序,打印其中 字母按字母顺序排列。例如,如果
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)