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
相关产品推荐
相关产品推荐

