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

时间:2018-03-31 05:59:09

标签: python for-loop concept

我正在完成计算机科学入门和使用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)

1 个答案:

答案 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

这个嵌套循环允许我们通过选择ij的每个组合来检查每个子序列。

第一个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)选择最长的。