通配符匹配。给定一个字符串 (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 | |