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

Finding longest alphabetical substring - understanding the concepts in Python

我正在使用 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 print

Longest 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

有很多关于stack overflow的帖子,人们只是在追逐或给出代码作为答案。我希望了解代码背后的概念,因为我是编程新手,希望更好地了解基础知识

我发现以下代码似乎可以回答问题。我了解 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

这个嵌套循环将允许我们通过选择 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) 选出最长的一个。