通配符匹配(Wildcard Matching)的进阶版:支持多模式匹配的通配符匹配
字数 1591 2025-11-06 12:40:14

通配符匹配(Wildcard Matching)的进阶版:支持多模式匹配的通配符匹配

题目描述
给定一个输入字符串 s 和一组通配符模式 patterns,其中每个模式可能包含以下特殊字符:

  • *:匹配任意长度的任意字符序列(包括空序列)
  • ?:匹配任意单个字符
    要求判断字符串 s 是否匹配任意一个模式(即存在至少一个模式与 s 完全匹配)。例如:
  • 输入:s = "abcde", patterns = ["a*c?e", "ab*"]
  • 输出:true(因为 s 匹配模式 "a*c?e"

解题思路

  1. 问题分析
    基础的通配符匹配问题(单个模式)可通过动态规划解决,定义 dp[i][j] 表示 s 的前 i 个字符与模式的前 j 个字符是否匹配。多模式匹配问题可转化为对每个模式独立运行单模式匹配算法,若任一模式匹配成功则返回 true

  2. 单模式匹配的动态规划状态定义
    dp[i][j] 表示字符串 s 的前 i 个字符与模式 p 的前 j 个字符的匹配情况。

    • 初始化:dp[0][0] = true(空字符串匹配空模式)
    • 若模式 p 的前 j 个字符均为 *,则 dp[0][j] = true(因为 * 可匹配空序列)
  3. 状态转移方程

    • p[j-1] 是普通字符且 s[i-1] == p[j-1],则 dp[i][j] = dp[i-1][j-1]
    • p[j-1]?,则 dp[i][j] = dp[i-1][j-1]
    • p[j-1]*,则 * 可匹配空序列(dp[i][j] = dp[i][j-1])或匹配多个字符(dp[i][j] = dp[i-1][j]
  4. 多模式匹配的实现
    遍历每个模式,若任一模式的动态规划表满足 dp[len(s)][len(pattern)] == true,则返回 true


逐步详解
步骤 1:初始化单模式匹配表
s = "abcde" 和模式 p = "a*c?e" 为例:

  • 构建二维表 dp[6][6](索引从 0 到 5,分别对应空字符和每个字符)。
  • 初始化第一行:dp[0][0] = true,且若 p 的前 j 个字符为 *,则 dp[0][j] = true

步骤 2:填充动态规划表
逐行遍历 i(从 1 到 5)和 j(从 1 到 5):

  • i=1, j=1s[0]='a' 匹配 p[0]='a',转移自 dp[0][0]=truedp[1][1]=true
  • i=1, j=2p[1]='*',可匹配空(dp[1][1]=true)或多字符(dp[0][2]=false)→ dp[1][2]=true
  • i=2, j=2p[1]='*',匹配空(dp[2][1]=false)或多字符(dp[1][2]=true)→ dp[2][2]=true
  • 继续填充至 i=5, j=5:最终 dp[5][5]=true,匹配成功。

步骤 3:多模式判断
对模式 "ab*" 重复上述过程,若 dp[5][3]=false,则跳过。因第一个模式已匹配,最终返回 true


优化与边界处理

  1. 剪枝:若某个模式匹配成功,立即返回结果,避免无效计算。
  2. 空间优化:单模式匹配中,dp 表可优化为滚动数组,空间复杂度降至 O(min(m, n))
  3. 特殊用例:若模式为 "*",直接返回 true;若 s 为空,仅当模式为全 * 时匹配。

通过上述步骤,可高效解决多模式通配符匹配问题。

通配符匹配(Wildcard Matching)的进阶版:支持多模式匹配的通配符匹配 题目描述 给定一个输入字符串 s 和一组通配符模式 patterns ,其中每个模式可能包含以下特殊字符: * :匹配任意长度的任意字符序列(包括空序列) ? :匹配任意单个字符 要求判断字符串 s 是否匹配 任意一个 模式(即存在至少一个模式与 s 完全匹配)。例如: 输入: s = "abcde" , patterns = ["a*c?e", "ab*"] 输出: true (因为 s 匹配模式 "a*c?e" ) 解题思路 问题分析 : 基础的通配符匹配问题(单个模式)可通过动态规划解决,定义 dp[i][j] 表示 s 的前 i 个字符与模式的前 j 个字符是否匹配。多模式匹配问题可转化为对每个模式独立运行单模式匹配算法,若任一模式匹配成功则返回 true 。 单模式匹配的动态规划状态定义 : 设 dp[i][j] 表示字符串 s 的前 i 个字符与模式 p 的前 j 个字符的匹配情况。 初始化: dp[0][0] = true (空字符串匹配空模式) 若模式 p 的前 j 个字符均为 * ,则 dp[0][j] = true (因为 * 可匹配空序列) 状态转移方程 : 若 p[j-1] 是普通字符且 s[i-1] == p[j-1] ,则 dp[i][j] = dp[i-1][j-1] 若 p[j-1] 是 ? ,则 dp[i][j] = dp[i-1][j-1] 若 p[j-1] 是 * ,则 * 可匹配空序列( dp[i][j] = dp[i][j-1] )或匹配多个字符( dp[i][j] = dp[i-1][j] ) 多模式匹配的实现 : 遍历每个模式,若任一模式的动态规划表满足 dp[len(s)][len(pattern)] == true ,则返回 true 。 逐步详解 步骤 1:初始化单模式匹配表 以 s = "abcde" 和模式 p = "a*c?e" 为例: 构建二维表 dp[6][6] (索引从 0 到 5,分别对应空字符和每个字符)。 初始化第一行: dp[0][0] = true ,且若 p 的前 j 个字符为 * ,则 dp[0][j] = true 。 步骤 2:填充动态规划表 逐行遍历 i (从 1 到 5)和 j (从 1 到 5): i=1, j=1 : s[0]='a' 匹配 p[0]='a' ,转移自 dp[0][0]=true → dp[1][1]=true i=1, j=2 : p[1]='*' ,可匹配空( dp[1][1]=true )或多字符( dp[0][2]=false )→ dp[1][2]=true i=2, j=2 : p[1]='*' ,匹配空( dp[2][1]=false )或多字符( dp[1][2]=true )→ dp[2][2]=true 继续填充至 i=5, j=5 :最终 dp[5][5]=true ,匹配成功。 步骤 3:多模式判断 对模式 "ab*" 重复上述过程,若 dp[5][3]=false ,则跳过。因第一个模式已匹配,最终返回 true 。 优化与边界处理 剪枝 :若某个模式匹配成功,立即返回结果,避免无效计算。 空间优化 :单模式匹配中, dp 表可优化为滚动数组,空间复杂度降至 O(min(m, n)) 。 特殊用例 :若模式为 "*" ,直接返回 true ;若 s 为空,仅当模式为全 * 时匹配。 通过上述步骤,可高效解决多模式通配符匹配问题。