leetcode-wildcard-matching

题目大意

  https://leetcode.com/problems/wildcard-matching/

  判断一个字符串s是否满足模式串p,p中所含匹配符只可能是*?

题目分析

  典型的动态规划,下面我是用记忆化搜索实现,注意不能用int数组保存状态,否则会超内存,其实仅仅需要三个状态,因此用char数组就可以,0代表未计算过,1代表true,2代表false。

代码

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
58
59
60
61
62
63
64
65
66
67
68
69
public class Solution {
private char[][] dp;
private int search(String s, int si, String p, int pi) {
if (dp[si][pi] > 0) {
return dp[si][pi];
}
int lenS = s.length();
int lenP = p.length();
//有一方为空单独处理
if (si > lenS - 1 && pi > lenP - 1) {
return dp[si][pi] = 1;
}
// 匹配串空了
if (si > lenS - 1) {
for (int loc = pi; loc <= lenP - 1; loc++) {
if (p.charAt(loc) != '*') {
return dp[si][pi] = 2;
}
}
return dp[si][pi] = 1;
}
// 模式串空了
if (pi > lenP - 1) {
return dp[si][pi] = 2;
}
// 正常处理
char a = s.charAt(si);
char b = p.charAt(pi);
if (b != '*' && b != '?') { // b不是*或者?
if (a != b) {
return dp[si][pi] = 2;
}
return search(s, si + 1, p, pi + 1);
}
if (b == '*') {
for (int loc = si; loc <= lenS; loc++) {
if (search(s, loc, p, pi + 1) == 1) {
return dp[si][pi] = 1;
}
}
return dp[si][pi] = 2;
}
if (b == '?') {
return search(s, si + 1, p, pi + 1);
}
return dp[si][pi] = 2;
}
public boolean isMatch(String s, String p) {
if (s == null || p == null) {
return false;
}
int lenS = s.length();
int lenP = p.length();
dp = new char[lenS + 1][lenP + 1];
for (int i = 0; i <= lenS; i++) {
for (int j = 0; j <= lenP; j++) {
dp[i][j] = 0;
}
}
return search(s, 0, p, 0) == 1 ? true : false;
}
}