Python实现Leetcode目标解析题时为何括号索引返回重复值?
Leetcode "Goal 字符串解析"题实现异常排查
问题复现
- 题目解析规则:输入字符串按映射关系转换,
G直接映射为G,()映射为o,(al)映射为al,拼接所有转换结果即为最终输出 - 测试用例:输入
command = "G()(al)",预期输出为Goal - 原代码运行结果:返回
Goo,不符合预期 - 调试现象:遍历命令字符串匹配到所有
(时,打印command.index(i)的输出为1、1,看似程序在重复处理同一个位置的字符
错误根因
- 遍历逻辑没有出错
字符串"G()(al)"本身包含两个(字符,分别位于索引1和索引4的位置,循环确实在按顺序遍历所有元素,没有重复迭代。 - 核心问题出在
str.index()方法的特性str.index(子串)方法只会返回目标子串在原字符串中第一次出现的索引值,不会根据当前遍历的位置动态定位后续出现的相同字符
不管遍历到第几个(,调用command.index('(')永远返回第一个(所在的索引1,这就是调试时两个输出都是1的原因。 - 错位的判断逻辑导致结果错误
当遍历到第二个位于索引4的(时,代码仍然错误使用索引1做后续判断,检查command[1+1]的字符——这个位置是第一个括号内的),因此程序会再次错误拼接一次o,完全不会走到匹配(al)的分支,最终得到Goo的错误输出。
修复方案
方案1:基于索引的顺序遍历匹配
弃用str.index()做位置定位,改用动态游标逐位扫描字符串,按规则匹配后直接跳过已处理的字符:
def interpret(command: str) -> str: res = [] length = len(command) cur = 0 while cur < length: if command[cur] == 'G': res.append('G') cur += 1 elif command[cur + 1] == ')': res.append('o') cur += 2 else: res.append('al') cur += 4 return ''.join(res)
该方案使用列表拼接结果,避免Python字符串不可变特性带来的额外性能开销,适配所有同类规则匹配场景。
方案2:基于字符串替换的极简实现
本题的三个映射规则不存在重叠冲突,可以直接通过全局替换完成解析,不需要手动维护游标:
def interpret(command: str) -> str: return command.replace('()', 'o').replace('(al)', 'al')
该方案代码量最短,可读性最高,运行时由Python内置C实现的替换逻辑处理,性能优于手动逐字符遍历。
内容的提问来源于stack exchange,提问作者v1ct0rv00rh33s
相关产品推荐
相关产品推荐

