LeetCode 题解工作台

子字符串匹配模式

给你一个字符串 s 和一个模式字符串 p ,其中 p 恰好 包含 一个 '*' 符号。 p 中的 '*' 符号可以被替换为零个或多个字符组成的任意字符序列。 如果 p 可以变成 s 的 子字符串 ,那么返回 true ,否则返回 false 。 示例 1: 输入: s = "leetcode", p…

category

2

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

简单 · string·结合·string·matching

bolt

答案摘要

根据题目描述,`*` 可以被替换为零个或多个字符组成的任意字符序列,因此我们可以将模式字符串 按照 `*` 分割成若干个子串,如果这些子串依次出现在字符串 中且顺序不变,则说明 可以变成 的子字符串。 因此,我们首先初始化一个指针 指向字符串 的起始位置,然后遍历模式字符串 按照 `*` 分割得到的每个子串 ,在字符串 中从位置 开始查找子串 ,如果找到了,则将指针 移动到子串…

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 string·结合·string·matching 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个字符串 s 和一个模式字符串 p ,其中 p 恰好 包含 一个 '*' 符号。

p 中的 '*' 符号可以被替换为零个或多个字符组成的任意字符序列。

如果 p 可以变成 s 的 子字符串,那么返回 true ,否则返回 false 。

 

示例 1:

输入:s = "leetcode", p = "ee*e"

输出:true

解释:

将 '*' 替换为 "tcod" ,子字符串 "eetcode" 匹配模式串。

示例 2:

输入:s = "car", p = "c*v"

输出:false

解释:

不存在匹配模式串的子字符串。

示例 3:

输入:s = "luck", p = "u*"

输出:true

解释:

子字符串 "u" ,"uc" 和 "uck" 都匹配模式串。

 

提示:

  • 1 <= s.length <= 50
  • 1 <= p.length <= 50
  • s 只包含小写英文字母。
  • p 只包含小写英文字母和一个 '*' 符号。
lightbulb

解题思路

方法一:字符串匹配

根据题目描述,* 可以被替换为零个或多个字符组成的任意字符序列,因此我们可以将模式字符串 pp 按照 * 分割成若干个子串,如果这些子串依次出现在字符串 ss 中且顺序不变,则说明 pp 可以变成 ss 的子字符串。

因此,我们首先初始化一个指针 ii 指向字符串 ss 的起始位置,然后遍历模式字符串 pp 按照 * 分割得到的每个子串 tt,在字符串 ss 中从位置 ii 开始查找子串 tt,如果找到了,则将指针 ii 移动到子串 tt 的末尾位置继续查找下一个子串;如果找不到,则说明模式字符串 pp 不能变成字符串 ss 的子字符串,返回 false\text{false}。如果所有子串都找到了,则返回 true\text{true}

时间复杂度 O(n×m)O(n \times m),空间复杂度 O(m)O(m)。其中 nnmm 分别是字符串 ss 和模式字符串 pp 的长度。

1
2
3
4
5
6
7
8
9
10
class Solution:
    def hasMatch(self, s: str, p: str) -> bool:
        i = 0
        for t in p.split("*"):
            j = s.find(t, i)
            if j == -1:
                return False
            i = j + len(t)
        return True
speed

复杂度分析

指标
时间complexity depends on scanning s and checking prefix and suffix matches, roughly O(n * m) where n = s.length and m = p.length. Space complexity is O(1) extra if no substring storage is needed.
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Notice the pattern contains exactly one '*' indicating a split-match approach.

  • question_mark

    Ask about handling empty matches for the '*' character.

  • question_mark

    Check if your substring scanning handles all offsets efficiently.

warning

常见陷阱

外企场景
  • error

    Forgetting that '*' can match zero characters, leading to missed valid matches.

  • error

    Checking substrings shorter than prefix+suffix, which cannot match.

  • error

    Incorrectly matching prefix and suffix positions causing false negatives.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Patterns containing multiple '*' characters requiring backtracking or DP.

  • arrow_right_alt

    Case-insensitive matching or Unicode string support.

  • arrow_right_alt

    Finding all matching substrings instead of just returning true/false.

help

常见问题

外企场景

子字符串匹配模式题解:string·结合·string·matchi… | LeetCode #3407 简单