通配符匹配(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")
解题思路
-
问题分析:
基础的通配符匹配问题(单个模式)可通过动态规划解决,定义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]=truei=1, j=2:p[1]='*',可匹配空(dp[1][1]=true)或多字符(dp[0][2]=false)→dp[1][2]=truei=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为空,仅当模式为全*时匹配。
通过上述步骤,可高效解决多模式通配符匹配问题。