获取最长字母顺序子串时丢失字符串末尾字符问题排查
解决最长字母顺序子串丢失最后一个字符的问题
嘿,我一眼就揪出问题所在啦——你的代码完全没处理字符串的最后一个字符,而且递增逻辑里的字符添加时机也有小疏漏,咱们一步步拆解修复:
问题根源分析
看你代码里的核心判断:
if(i+1 < len(s)): if(s[i] <= s[i+1]): currentSubstring = currentSubstring + s[i] # ... 其他逻辑
当i是字符串最后一个索引时(比如输入"abcde"里的i=4,对应字符"e"),i+1 < len(s)直接不成立,这个分支被跳过,导致"e"从来没被加到currentSubstring里,自然出不了最终结果。
另外还有个小问题:就算在递增分支里,你只把当前字符s[i]加进去,下一个符合条件的字符要等下一次循环处理,可最后一次循环根本没机会执行这个逻辑。
修正后的代码
我调整了逻辑顺序,先把当前字符纳入子串,再判断是否需要截断,最后循环结束后补一次收尾检查:
s = input('Type in your string: ') current_substring = '' max_substring = '' for i, c in enumerate(s): # 先把当前字符加入当前子串,保证不会漏掉任何字符 current_substring += c # 如果不是最后一个字符,且下一个字符不满足递增,就触发比较和重置 if i + 1 < len(s) and s[i] > s[i+1]: if len(current_substring) > len(max_substring): max_substring = current_substring current_substring = '' # 循环结束后必须再检查!最后一段递增子串还没和最长子串做比较 if len(current_substring) > len(max_substring): max_substring = current_substring print(max_substring)
修正点说明
- 先加当前字符:不管是不是最后一个字符,先把它加入
current_substring,从根源避免丢字符 - 调整截断时机:只有当下一个字符不满足递增时,才更新最长子串并重置当前子串
- 循环后收尾检查:比如输入全递增的字符串时,循环里不会触发截断逻辑,这时候必须补一次比较
测试你的例子:输入abcde,现在输出就是abcde了;再试输入abczabc,输出会是abcz,完全符合预期~
内容的提问来源于stack exchange,提问作者P.H.
相关产品推荐
相关产品推荐

