Python提取重复字符拼接新串 遍历代码print未执行问题排查
问题需求
- 接收字符串输入,以输入
aabullc为例,循环处理后newstring应赋值为aall,规则是保留所有重复出现(出现次数≥2)的字符; - 兼容多数量重复字符场景:例如输入
aaabullc,预期返回结果为aaall。
当前编写的实现代码
def rearrangeLetters(S): print(len(S)) start = 0 newstring = "" for i in range(start+1, len(S)): if(S[start] == S[i]): newstring+=S[i] print(newstring) start +=1
现存问题
代码运行过程中print(newstring)语句始终未触发执行,无法得到预期的字符串处理结果。
问题根因
- 实现思路完全偏离需求:当前代码尝试通过移动
start指针匹配相邻重复字符,但需求实际是保留原字符串中所有出现次数≥2的字符,丢弃仅出现1次的字符,二者逻辑完全不匹配。 - 分支触发条件极易失效:
start初始值为0,循环从i=1开始,只有当S[0]和S[1]相等时才会第一次进入if分支;如果传入的字符串前两个字符不相等,start永远停在0位置,后续所有字符都和S[0]比对,没有匹配的话就永远进不了if分支,这就是print(newstring)不触发的直接原因。 - 指针逻辑错误:就算第一次匹配成功进入分支,
start指针也仅在匹配到重复字符时才右移,遇到不重复的字符时位置不变,后续所有字符都会和很早之前的start位置字符比对,根本无法匹配到后面位置的重复字符(比如示例中的两个l,因为start停在a的位置,永远无法和l匹配)。 - 对
range()机制理解错误:for i in range(start+1, len(S))在循环启动时就会生成固定的迭代序列,循环内部修改start的值不会改变i的迭代范围,进一步导致逻辑失控。 - 字符收集逻辑缺失:就算匹配到重复字符,代码也只追加了后一位的重复字符,没有把基准位置的字符加入结果,就算逻辑跑通也会少字符,且函数没有返回值,外部无法获取处理结果。
修复后代码
如果可以依赖标准库,实现最简洁:
from collections import Counter def rearrangeLetters(S): # 统计每个字符的出现频次 char_count = Counter(S) newstring = "" # 按原顺序遍历,仅保留出现次数≥2的字符 for c in S: if char_count[c] >= 2: newstring += c return newstring # 测试用例 print(rearrangeLetters("aabullc")) # 输出 aall print(rearrangeLetters("aaabullc")) # 输出 aaall
如果不想引入额外模块,用字典手动统计频次即可:
def rearrangeLetters(S): char_count = {} # 第一次遍历统计频次 for c in S: char_count[c] = char_count.get(c, 0) + 1 newstring = "" # 第二次遍历拼接结果 for c in S: if char_count[c] >= 2: newstring += c return newstring
修复说明
- 频次统计+顺序遍历的逻辑时间复杂度为O(n),效率远高于原错误的相邻比对逻辑。
- 完全按照原字符顺序保留符合要求的字符,和需求给出的示例结果完全匹配。
- 去掉了错误的指针逻辑,不存在分支无法触发的问题,增加返回值后外部可以直接获取处理结果。
内容的提问来源于stack exchange,提问作者jgrewal
相关产品推荐
相关产品推荐

