Given an input string (s
) and a pattern (p
), implement wildcard pattern matching with support for '?'
and '*'
where:
'?'
Matches any single character.'*'
Matches any sequence of characters (including the empty sequence).
The matching should cover the entire input string (not partial).
Input: s = "aa", p = "a" Output: false Explanation: "a" does not match the entire string "aa".
Input: s = "aa", p = "*" Output: true Explanation: '*' matches any sequence.
Input: s = "cb", p = "?a" Output: false Explanation: '?' matches 'c', but the second letter is 'a', which does not match 'b'.
0 <= s.length, p.length <= 2000
s
contains only lowercase English letters.p
contains only lowercase English letters,'?'
or'*'
.
impl Solution {
pub fn is_match(s: String, p: String) -> bool {
let s = s.as_bytes();
let p = p.as_bytes();
let mut dp = vec![false; s.len() + 1];
dp[0] = true;
for i in 1..=p.len() {
let mut tmp = vec![false; s.len() + 1];
let mut prefix_or = dp[0];
if p[i - 1] == b'*' {
tmp[0] = dp[0];
}
for j in 1..=s.len() {
prefix_or |= dp[j];
match p[i - 1] {
b'?' => tmp[j] = dp[j - 1],
b'*' => tmp[j] = prefix_or,
_ => tmp[j] = p[i - 1] == s[j - 1] && dp[j - 1],
}
}
dp = tmp;
}
dp[s.len()]
}
}