给定一个字符串 (s
) 和一个字符模式 (p
) ,实现一个支持 '?'
和 '*'
的通配符匹配。
1 | '?' 可以匹配任何单个字符。 |
两个字符串完全匹配才算匹配成功。
说明:
s
可能为空,且只包含从a-z
的小写字母。p
可能为空,且只包含从a-z
的小写字母,以及字符?
和*
。
示例:
1 | 输入: |
分析:
$$
\
题解1:和第十题类似,双字符串匹配问题,可以用动态规划来做。\
状态表示:\
dp[i][j]代表s的前i个字符和p的前j个字符是否匹配。\
状态初始化:dp[0][0] = true,对于1 <= i <= m如果p[i - 1] = ‘‘ && dp[0][i - 1]那么dp[0][i] = true,这对应着p以*as开头的字符串,因为可以代表0个字符,所以可以往后匹配。\
状态转移:\
s[i - 1] == p[j - 1] || 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][j - 1]\
如果不是空串,那么dp[i][j] = dp[i - 1][j]。这是因为代表了任意多个字符,如果能匹配前i - 1个字符,那么就在代表的字符串后面加上s[i],就可以匹配前i个字符啦。\
$$
1 | 模板题:高精度乘法 |
代码
1 | class Solution { |
[原题链接](44. 通配符匹配 - 力扣(Leetcode))