You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式疑问:为何.无法匹配\w可匹配内容?LeetCode退格问题

嘿,我来帮你搞清楚这个问题!

首先,你提到的“.不能匹配\w能匹配的内容”其实是误解——.完全可以匹配\w覆盖的小写字母,但问题出在.还能匹配#本身,这就导致了正则替换的逻辑和你预期的退格行为不符。

核心差异分析

  1. \w vs . 的匹配范围

    • \w在正则中仅匹配字母、数字和下划线,对应题目里的小写字母,所以\w#只会匹配有效字符+退格的组合,正好对应“退格删除前一个字符”的逻辑。
    • .匹配除换行符外的任意字符,包括#,所以(.#)会匹配两种组合:
      • 有效字符+退格(和\w#一样)
      • 退格+退格(##)
  2. 不符合退格逻辑的关键问题
    题目中的#是退格,规则是:遇到#就删除前一个字符,如果前面没有字符则忽略。但(.#)把##匹配并替换为空,相当于两个退格互相抵消,这和实际的退格逻辑不符——虽然##最终结果也是空,但在复杂字符串的处理过程中,会错误地保留或删除字符。

你的测试用例拆解

看你给出的测试用例S = "du###vu##v#fbtu":

  • 用\w#时:
    每次只替换“字母+#”的组合,比如先替换u#、u#、v#,剩下的#只能通过循环删除开头的方式处理,完全模拟了退格删除前一个字符的逻辑,最终得到正确的fbtu。
  • 用(.#)时:
    正则会同时匹配##组合,替换时会把连续的退格直接抵消,而不是逐个删除前一个字符。再加上你代码中re.sub的参数写错了(第四个参数是count而非flags,re.DOTALL被当成了count=8,导致最多替换8次),部分匹配没有被处理,最终错误地保留了d,得到dfbtu。

更靠谱的解决方案

其实用正则处理退格问题容易踩坑,更直观且符合逻辑的方法是用栈模拟退格过程:

class Solution:
    def backspaceCompare(self, S: str, T: str) -> bool:
        def process_string(s):
            stack = []
            for c in s:
                if c != '#':
                    stack.append(c)
                elif stack:
                    stack.pop()
            return ''.join(stack)
        return process_string(S) == process_string(T)

这个方法逐字符处理,遇到非#就入栈,遇到#就出栈(栈非空时),完美贴合题目中的退格规则,而且时间复杂度是O(n+m),效率更高。

内容的提问来源于stack exchange,提问作者Her0Her0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:27:28