You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python代码问题:寻找最长字母序子串结果异常,求排查

问题:最长字母顺序子串代码错误排查

需求说明

输入小写字符串s,输出其中最长的按字母顺序排列的子串;若多个子串长度相同,输出第一个出现的。

  • 示例1:s='azcbobobegghakl' → 输出Longest substring in alphabetical order is: beggh
  • 示例2:s='abcbcd' → 输出Longest substring in alphabetical order is: abc
  • 测试失败案例:s='vettmlxvn',代码输出lxv,正确结果应为ett

出错代码

s = 'vettmlxvn'

alphabet = "abcdefghijklmnopqrstuvwxyz"
substring = ""
highest_len = 0
highest_string = ""
counter = 0


for letter in s:
    counter += 1
    if s.index(letter) == 0:
        substring = substring + letter
        highest_len = len(substring)
        highest_string = substring
    else:
        x = alphabet.index(substring[-1])
        y = alphabet.index(letter)
        if y >= x:
            substring = substring + letter
            if counter == len(s) and len(substring) > highest_len:
                highest_len = len(substring)
                highest_string = substring
        else:
            if len(substring) > highest_len:
                highest_len = len(substring)
                highest_string = substring
                substring = "" + letter
            else:
                substring = "" + letter

print("Longest substring in alphabetical order is: " + highest_string)

错误原因分析

1. s.index(letter)的致命逻辑错误

s.index(letter)返回的是该字符在字符串中第一次出现的索引,而非当前循环的位置。当字符串出现重复字符时(比如测试案例中的第二个v),会错误触发第一个分支,强制将highest_len和highest_string替换为当前子串,直接覆盖之前记录的正确最长子串(如ett)。

2. 子串增长时未实时更新最长记录

只有在遇到不满足字母顺序的字符,或循环到最后一个字符时才检查是否更新最长子串。如果最长子串在增长过程中已经超过当前最长长度,无法及时更新(这个问题在测试案例中被第一个错误掩盖,但属于代码的核心隐患)。

3. 第一个分支的强制更新逻辑错误

进入第一个分支时,无论当前子串长度是否小于已记录的最长长度,都会强制覆盖highest_len和highest_string,这会直接破坏之前的正确记录。

修正方案

修正后的代码

s = 'vettmlxvn'

current_sub = s[0]
longest_sub = s[0]

for i in range(1, len(s)):
    # 当前字符满足递增条件,添加到当前子串
    if s[i] >= current_sub[-1]:
        current_sub += s[i]
        # 实时检查是否需要更新最长子串
        if len(current_sub) > len(longest_sub):
            longest_sub = current_sub
    else:
        # 重置当前子串为当前字符
        current_sub = s[i]

print("Longest substring in alphabetical order is:", longest_sub)

代码说明

  • 直接用字符串索引遍历,避免index()方法的错误;
  • 初始化时直接处理第一个字符,无需特殊分支判断;
  • 子串增长时实时检查并更新最长记录,确保不会遗漏;
  • 逻辑简洁,去掉冗余的counter和alphabet索引操作。

内容的提问来源于stack exchange,提问作者dav123_34

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:36:18