-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWildcardMatching.java
More file actions
57 lines (52 loc) · 2.11 KB
/
WildcardMatching.java
File metadata and controls
57 lines (52 loc) · 2.11 KB
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.util.Arrays;
/*
* https://leetcode.com/problems/wildcard-matching/
*/
public class WildcardMatching {
public boolean isMatch(String s, String p) {
Boolean[][] match = new Boolean[s.length() + 1][p.length() + 1];
return checkMatch(s, p, match);
}
private boolean checkMatch(String s, String p, Boolean[][] match) {
if (p.isEmpty()) {
match[s.length()][p.length()] = s.isEmpty();
return s.isEmpty();
}
p = p.replaceAll("\\*\\*", "\\*");
if (p.equals("*")) {
match[s.length()][p.length()] = true;
return true;
}
if (s.isEmpty()) {
match[s.length()][p.length()] = false;
return false;
}
if (match[s.length()][p.length()] != null) {
return match[s.length()][p.length()];
}
int starCount = (int) p.chars().filter(value -> value == 42).count();
if (s.length() < p.length() - starCount) {
return false;
}
char firstPCharacter = p.charAt(0);
char firstSCharacter = s.charAt(0);
switch (firstPCharacter) {
case '?':
boolean b = checkMatch(s.substring(1), p.substring(1), match);
match[s.length()][p.length()] = b;
return b;
case '*':
boolean b2 = checkMatch(s.substring(1), p, match) || checkMatch(s, p.substring(1), match);
match[s.length()][p.length()] = b2;
return b2;
default:
boolean b1 = firstPCharacter == firstSCharacter && checkMatch(s.substring(1), p.substring(1), match);
match[s.length()][p.length()] = b1;
return b1;
}
}
public static void main(String[] args) {
System.out.println(new WildcardMatching().isMatch("babbbbaabababaabbababaababaabbaabababbaaababbababaaaaaabbabaaaabababbabbababbbaaaababbbabbbbbbbbbbaabbb", "b**bb**a**bba*b**a*bbb**aba***babbb*aa****aabb*bbb***a")); // true
// System.out.println(new WildcardMatching().isMatch("abcdefghij", "a*??hi*j")); // true
}
}