想学py的小白 发表于 2023-4-4 16:47:53

假定 s 是小写字母的字符串。编写程序,输出 s 的最长子串(子串必须 是字母顺序)。

def longest_sub(string):
    i = 0
    max_length = 1
    temp_length = 1
    while (i < len(string) - 1):
      if (string <= string):
            temp_length += 1
            if (temp_length > max_length):
                max_length = temp_length
               
                max_index = i + 1
      else:
            temp_length = 1
      i += 1
    print("Longest substring in alphabetetic order is: ", end=' ')
    for i in range(max_index - max_length + 1, max_index + 1):
      print(string, end='')
    print('\n')
s = 'azcbobobegghakl'
longest_sub(s)
s = 'abcbcd'
longest_sub(s)

搜到的正确代码是这样的,但是我看不懂while部分那一段。有没有大佬详细讲解一下?万分感谢

isdkz 发表于 2023-4-4 16:59:19

首先,程序定义了一个名为longest_sub的函数,它接受一个字符串作为参数。这个函数的目的是找到字符串中按字母顺序排列的最长子串。

在函数内部,有几个变量被初始化:


[*]i:这是一个循环计数器,从0开始,用于遍历字符串的每个字符。
[*]max_length:用于存储当前找到的最长子串的长度,初始化为1,因为至少有一个字符。
[*]temp_length:用于存储当前正在检查的子串的长度,也初始化为1。


现在,我们来看while循环。这个循环会持续进行,直到i到达字符串倒数第二个字符的位置(因为我们将要检查i和i + 1之间的关系)。

在循环中,首先检查字符串中的第i个字符(string[i])是否小于或等于第i+1个字符(string)。如果满足条件,说明这两个个字符是按字母顺序排列的。这时,我们执行以下操作:


[*]将 temp_length(当前子串的长度)增加 1,因为我们找到了一个新的按字母顺序排列的字符。
[*]检查 temp_length 是否大于 max_length(目前找到的最长子串的长度)。如果大于,说明我们找到了一个更长的子串。我们将 max_length 更新为 temp_length,并将 max_index 设置为 i + 1。max_index 用于记录最长子串的结束位置。


如果 string] 不小于等于 string,说明当前子串结束了。此时,我们将 temp_length 重置为 1,表示新子串的开始。

在循环结束后,我们已经找到了按字母顺序排列的最长子串。接下来,我们需要输出这个子串。为了实现这一点,我们使用一个 for 循环,从 max_index - max_length + 1(最长子串的开始位置)遍历到 max_index + 1(最长子串的结束位置的下一个字符)。在循环中,我们打印每个字符,直到输出完整个子串。

最后的两个示例调用展示了如何使用这个函数。第一个示例字符串 s = 'azcbobobegghakl',调用 longest_sub(s) 时,程序将输出 'beggh',因为这是字符串 s 中按字母顺序排列的最长子串。

第二个示例字符串 s = 'abcbcd',调用 longest_sub(s) 时,程序将输出 'abc',因为这是字符串 s 中按字母顺序排列的最长子串。

总结一下,这个程序的主要逻辑在于使用一个 while 循环遍历输入字符串,检查相邻字符之间的顺序关系。当发现按字母顺序排列的子串时,更新子串的长度和结束位置。在循环结束后,输出找到的最长子串。
页: [1]
查看完整版本: 假定 s 是小写字母的字符串。编写程序,输出 s 的最长子串(子串必须 是字母顺序)。