【问题标题】:Finding longest alphabetical substring - understanding the concepts in Python查找最长的字母子串 - 理解 Python 中的概念
【发布时间】:2020-08-28 05:49:00
【问题描述】:

我正在完成计算机科学和使用 Python 编程课程的介绍,并被困在第 1 周:Python 基础 - 问题集 1 - 问题 3。

问题问:

假设 s 是一串小写字符。

编写一个程序,打印 s 的最长子串,其中 字母按字母顺序出现。例如,如果s = 'azcbobobegghakl',那么你的程序应该打印

按字母顺序排列的最长子串是:beggh

在平局的情况下,打印第一个子字符串。例如,如果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)

【问题讨论】:

    标签: python for-loop concept


    【解决方案1】:

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

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

    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 循环之后看起来像这样:['cy', 'fj', 'ccl', 'bx', 'bo', 'gk']

    max(..., key=len) 从中选出最长的。

    【讨论】:

    • 谢谢@olivierm。您清晰的解释帮助我理解了嵌套循环和比较在做什么。干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多