鱼C论坛

 找回密码
 立即注册
查看: 2299|回复: 1

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

[复制链接]
发表于 2023-4-4 16:47:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def longest_sub(string):
    i = 0
    max_length = 1
    temp_length = 1
    while (i < len(string) - 1):
        if (string[i] <= string[i + 1]):
            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[i], end='')
    print('\n')
s = 'azcbobobegghakl'
longest_sub(s)
s = 'abcbcd'
longest_sub(s)

搜到的正确代码是这样的,但是我看不懂while部分那一段。有没有大佬详细讲解一下?万分感谢
最佳答案
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[i + 1])。如果满足条件,说明这两个个字符是按字母顺序排列的。这时,我们执行以下操作:

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


如果 string[i] 不小于等于 string[i + 1],说明当前子串结束了。此时,我们将 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 循环遍历输入字符串,检查相邻字符之间的顺序关系。当发现按字母顺序排列的子串时,更新子串的长度和结束位置。在循环结束后,输出找到的最长子串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i + 1])。如果满足条件,说明这两个个字符是按字母顺序排列的。这时,我们执行以下操作:

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


如果 string[i] 不小于等于 string[i + 1],说明当前子串结束了。此时,我们将 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 循环遍历输入字符串,检查相邻字符之间的顺序关系。当发现按字母顺序排列的子串时,更新子串的长度和结束位置。在循环结束后,输出找到的最长子串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 01:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表