You need to enable JavaScript to run this app. Python实现Leetcode目标解析题时为何括号索引返回重复值?
优惠活动
大模型
产品
解决方案
定价
更多

Python实现Leetcode目标解析题时为何括号索引返回重复值?

Leetcode "Goal 字符串解析"题实现异常排查

问题复现

  • 题目解析规则:输入字符串按映射关系转换,G直接映射为G,()映射为o,(al)映射为al,拼接所有转换结果即为最终输出
  • 测试用例:输入command = "G()(al)",预期输出为Goal
  • 原代码运行结果:返回Goo,不符合预期
  • 调试现象:遍历命令字符串匹配到所有(时,打印command.index(i)的输出为1、1,看似程序在重复处理同一个位置的字符

错误根因

  1. 遍历逻辑没有出错
    字符串"G()(al)"本身包含两个(字符,分别位于索引1和索引4的位置,循环确实在按顺序遍历所有元素,没有重复迭代。
  2. 核心问题出在str.index()方法的特性

    str.index(子串)方法只会返回目标子串在原字符串中第一次出现的索引值,不会根据当前遍历的位置动态定位后续出现的相同字符
    不管遍历到第几个(,调用command.index('(')永远返回第一个(所在的索引1,这就是调试时两个输出都是1的原因。

  3. 错位的判断逻辑导致结果错误
    当遍历到第二个位于索引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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.13 18:36:08