kniost

谁怕,一蓑烟雨任平生

0%

LeetCode 44. Wildcard Matching

44. Wildcard Matching

Difficulty: Hard

Given an input string (s) and a pattern (p), implement wildcard pattern matching with support for '?' and '*'.

1
2
'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

Note:

  • s could be empty and contains only lowercase letters a-z.
  • p could be empty and contains only lowercase letters a-z, and characters like ? or *.

Example 1:

1
2
3
4
5
Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".

Example 2:

1
2
3
4
5
Input:
s = "aa"
p = "*"
Output: true
Explanation: '*' matches any sequence.

Example 3:

1
2
3
4
5
Input:
s = "cb"
p = "?a"
Output: false
Explanation: '?' matches 'c', but the second letter is 'a', which does not match 'b'.

Example 4:

1
2
3
4
5
Input:
s = "adceb"
p = "*a*b"
Output: true
Explanation: The first '*' matches the empty sequence, while the second '*' matches the substring "dce".

Example 5:

1
2
3
4
Input:
s = "acdcb"
p = "a*c?b"
Output: false

Solution

Language: Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution {
public boolean isMatch(String s, String p) {
if (s == null || p == null) {
return false;
}
if (s.length() == 0 && p.length() == 0) {
return true;
}
if (p.length() == 0) {
return false;
}
int m = s.length();
int n = p.length();
boolean[][] dp = new boolean[m + 1][n + 1];
dp[0][0] = true;
for (int i = 1; i <= n; i++) {
if (p.charAt(i - 1) == '*') {
dp[0][i] = true;
} else {
break;
}
}

for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
char cp = p.charAt(j - 1);
if (cp == '?') {
dp[i][j] = dp[i - 1][j - 1];
} else if (cp == '*') {
dp[i][j] = dp[i - 1][j - 1] || dp[i - 1][j] || dp[i][j - 1];
} else {
dp[i][j] = dp[i - 1][j - 1] && s.charAt(i - 1) == cp;
}
}
}

return dp[m][n];
}
}