-
Notifications
You must be signed in to change notification settings - Fork 0
44. Wildcard Matching
This problem is simliar to 10. Regular Expression Matching. The difference lies in how the *
works. In the previous problem, *
can only matches zero or more of its preceding element. In this problem, *
can match any sequence (including empty sequence).
Of course, both the problems can be solved with DP, and the key is how we process *
. In the previous problem, a* can be decoded as zero a
, one a
or more a
. Similarly, in this problem, *
can be decoded as empty sequence, one character or more character.
Here, we use a two demension array to denote whether substrings of s
and p
match. match[i][j]
denotes whether s.substring(0, i)
and p.substring(0, j)
matches. If p.charAt(j)
is not *
, we judge whether p.charAt(j)
and s.charAt(i)
matches. If p.charAt(j)
is *
, then there could be three conditions:
-
match[i][j] = match[i][j - 1]
, i.e.,*
is decoded as empty sequence -
match[i][j] = match[i - 1][j - 1]
, i.e.,*
is decoded as one character -
match[i][j] = match[i - 1][j]
, i.e.,*
is decoded as more than one character
public boolean isMatch(String s, String p) {
boolean match[][] = new boolean[s.length() + 1][p.length() + 1];
match[0][0] = true;
for (int i = 0; i < p.length(); i++) // judge whether the substring of p matches empty sequence
if (p.charAt(i) == '*')
match[0][i + 1] = match[0][i];
for (int i = 0; i < s.length(); i++)
for (int j = 0; j < p.length(); j++) {
if( p.charAt(j) == '*' )
match[i + 1][j + 1] = (match[i][j + 1] | match[i + 1][j] | match[i][j]);
else if( s.charAt(i) == p.charAt(j) || p.charAt(j) == '?' )
match[i + 1][j + 1] = match[i][j];
}
return match[s.length()][p.length()];
}