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]; } }
|