如何修复字符串最长字母序子串代码中的列表比较错误
解决字符串最长字母序连续子序列问题
兄弟,我看了你的代码,发现几个关键问题导致你卡壳了:
- 变量类型混乱:你一开始把
current_biggest和rn_str定义成列表,后面又把rn_str = i(整数),这就导致你之后想比较长度的时候,整数没有len()方法,自然报错。而且列表和整数也没法直接用>=比较,这就是你没法判断长度的核心原因。 - 循环内重复初始化:你在
for循环里每次都重置current_biggest和rn_str为['m'],这样之前遍历得到的序列都会被清空,根本没法累积追踪最长的那个序列。 - 逻辑判断搞反了:你的条件
if (s[i] >= s[i+1]) and (i < len(s))逻辑反了吧?应该是当s[i] <= s[i+1]的时候,才属于按字母序的连续序列呀,而且i < len(s)这个条件本来就在range(len(s)-1)的循环范围内,完全多余。
修复后的基础版本代码
先给你改好能跑通的版本,每一步都加了注释:
s = 'abcdebjnmzkloppk' # 初始化最长序列和当前序列,先把第一个字符放进去 current_sequence = [s[0]] longest_sequence = [s[0]] # 从第二个字符开始遍历整个字符串 for char in s[1:]: # 如果当前字符大于等于当前序列的最后一个字符,就加入当前序列 if char >= current_sequence[-1]: current_sequence.append(char) else: # 否则序列中断,重置当前序列为只包含当前字符 current_sequence = [char] # 每次检查当前序列长度是否超过最长序列,超过就更新最长序列 if len(current_sequence) > len(longest_sequence): longest_sequence = current_sequence.copy() # 用copy避免后续修改影响最长序列 # 把列表转成字符串输出更直观 print(''.join(longest_sequence)) # 输出结果:abcde
更高效的简化实现(省内存更简洁)
上面的版本用列表存序列,其实可以直接用字符串来追踪,代码更简洁,内存占用也更低:
s = 'abcdebjnmzkloppk' current_str = s[0] longest_str = s[0] for char in s[1:]: if char >= current_str[-1]: current_str += char else: current_str = char if len(current_str) > len(longest_str): longest_str = current_str print(longest_str) # 同样输出:abcde
额外小提示
如果你要找的不是连续的字母序子序列(比如abcz这种不连续但整体递增的),那逻辑会不一样,但从你的代码逻辑来看,你应该是想找连续的按字母序排列的最长子串,上面的代码就完全适用啦。
内容的提问来源于stack exchange,提问作者Jk128711
相关产品推荐
相关产品推荐

