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

2024-09-30 01:18:21 发布

您现在位置: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

有很多关于堆栈溢出的帖子,人们只是在追逐或者给出代码作为答案。我正在寻找理解的概念背后的代码,因为我是新的编程和希望获得一个更好的理解的基础

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

Tags: ofthe代码inforlongestifis
1条回答
网友
1楼 · 发布于 2024-09-30 01:18:21

让我们一步一步地检查你的代码。在

首先,我们假设第一个字符构成最长的序列。我们要做的是尝试改进这个猜测。在

s = 'cyqfjhcclkbxpbojgkar'

lstring = s[0]
slen = 1

第一个循环然后选择某个索引i,它将是序列的开始。从这里开始,我们将检查从i开始的所有现有序列,方法是用嵌套循环遍历序列的可能结尾。在

^{pr2}$

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

第一个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)

在while循环之后,列表substrings如下所示:['cy', 'fj', 'ccl', 'bx', 'bo', 'gk']

从中,max(..., key=len)选择最长的一个。在

相关问题 更多 >

    热门问题