通配符匹配。给定一个字符串 (s
) 和一个字符模式 (p
) ,实现一个支持 '?'
和 '*'
的通配符匹配。
1 |
|
两个字符串完全匹配才算匹配成功。
说明:
s
可能为空,且只包含从a-z
的小写字母。p
可能为空,且只包含从a-z
的小写字母,以及字符?
和*
。
示例 1:
1 |
|
示例 2:
1 |
|
示例 3:
1 |
|
示例 4:
1 |
|
示例 5:
1 |
|
思路一
使用动态规划解决,假设dp[i][j]
表示s[i:]
和p[j:]
是否匹配,通过自底向上进行遍历。每次比较 s[i:]
和 p[j:]
的第一个字符是否匹配:first_match = bool(s[i:]) and p[j] in {s[i], '?', '*'}
,则 dp[i][j]
的值存在以下两种情况:
- 当
p[j] = '*'
时,*
可能不匹配,则dp[i][j] = dp[i][j+1]
,或者*
匹配,则dp[i][j] = first_match && dp[i+1][j]
; - 当
p[j] != '*'
时,则dp[i][j] = first_match && dp[i+1][j+1]
。
时间复杂度 $O(SP)$。
1 |
|
思路二
使用两个指针分别指向 s
和 p
,在遍历的过程中进行匹配。时间复杂度 $O(SP)$,空间复杂度 $O(1)$。
1 |
|