-
Notifications
You must be signed in to change notification settings - Fork 44
/
_10_isMatch_2.java
108 lines (104 loc) · 3.13 KB
/
_10_isMatch_2.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
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package pp.arithmetic.leetcode;
/**
* Created by wangpeng on 2018/11/13.
* 10. 正则表达式匹配
* <p>
* 给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。
* <p>
* '.' 匹配任意单个字符。
* '*' 匹配零个或多个前面的元素。
* 匹配应该覆盖整个字符串 (s) ,而不是部分字符串。
* <p>
* 说明:
* <p>
* s 可能为空,且只包含从 a-z 的小写字母。
* p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
* 示例 1:
* <p>
* 输入:
* s = "aa"
* p = "a"
* 输出: false
* 解释: "a" 无法匹配 "aa" 整个字符串。
* 示例 2:
* <p>
* 输入:
* s = "aa"
* p = "a*"
* 输出: true
* 解释: '*' 代表可匹配零个或多个前面的元素, 即可以匹配 'a' 。因此, 重复 'a' 一次, 字符串可变为 "aa"。
* 示例 3:
* <p>
* 输入:
* s = "ab"
* p = ".*"
* 输出: true
* 解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
* 示例 4:
* <p>
* 输入:
* s = "aab"
* p = "c*a*b"
* 输出: true
* 解释: 'c' 可以不被重复, 'a' 可以被重复一次。因此可以匹配字符串 "aab"。
* 示例 5:
* <p>
* 输入:
* s = "mississippi"
* p = "mis*is*p*."
* 输出: false
*
* @see <a href="https://leetcode-cn.com/problems/regular-expression-matching/description/">regular-expression-matching</a>
*/
public class _10_isMatch_2 {
private static final int FRONT = -1;
public static void main(String[] args) {
//false
System.out.println(isMatch("aa", "aaa"));
//true
System.out.println(isMatch("aa", "aa"));
//true
System.out.println(isMatch("ab", ".*"));
//true
System.out.println(isMatch("aab", "c*a*b"));
//false
System.out.println(isMatch("mississippi", "mis*is*p*."));
}
/**
* 动态规划,要匹配上则需要s的每一位都匹配上,
*
* @param s
* @param p
* @return
*/
public static boolean isMatch(String s, String p) {
if (s == null || p == null)
return false;
//boolean 的二维数组; 行 s 列 p;
boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
dp[0][0] = true;
for (int i = 0; i < p.length(); i++) {
if (p.charAt(i) == '*' && dp[0][i - 1]) {
dp[0][i + 1] = true;
}
}
for (int i = 0; i < s.length(); i++) {
for (int j = 0; j < p.length(); j++) {
if (p.charAt(j) == s.charAt(i)) {
dp[i + 1][j + 1] = dp[i][j];
}
if (p.charAt(j) == '.') {
dp[i + 1][j + 1] = dp[i][j];
}
if (p.charAt(j) == '*') {
if (p.charAt(j - 1) != s.charAt(i) && p.charAt(j - 1) != '.') {
dp[i + 1][j + 1] = dp[i + 1][j - 1];
} else {
dp[i + 1][j + 1] = (dp[i + 1][j] || dp[i][j + 1] || dp[i + 1][j - 1]);
}
}
}
}
return dp[s.length()][p.length()];
}
}