-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRegularExpressionMatching.java
More file actions
118 lines (92 loc) · 3.28 KB
/
RegularExpressionMatching.java
File metadata and controls
118 lines (92 loc) · 3.28 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
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
package company;
/**
* @Author: Wenhang Chen
* @Description:给你一个字符串 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'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
* 示例 3:
* <p>
* 输入:
* s = "ab"
* p = ".*"
* 输出: true
* 解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
* 示例 4:
* <p>
* 输入:
* s = "aab"
* p = "c*a*b"
* 输出: true
* 解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
* 示例 5:
* <p>
* 输入:
* s = "mississippi"
* p = "mis*is*p*."
* 输出: false
* @Date: Created in 13:10 2/9/2020
* @Modified by:
*/
public class RegularExpressionMatching {
// 我太菜了,我是真不会,为啥想不出来呢!!!!
// 看了题解还是懵懵懂懂啊!!!!!!!!
public boolean isMatch(String s, String p) {
if (s == null || p == null) {
return false;
}
// 多留一个空位,因为存在为空字符串的情况
boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
//dp[i][j] 表示 s 的前 i 个是否能被 p 的前 j 个匹配
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; // here's y axis should be i+1
}
}
// 开始dp
for (int i = 0; i < s.length(); i++) {
for (int j = 0; j < p.length(); j++) {
// 如果是任意元素 或者是对于元素匹配
if (p.charAt(j) == '.' || p.charAt(j) == s.charAt(i)) {
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]);
/*
dp[i][j] = dp[i-1][j] // 多个字符匹配的情况
or dp[i][j] = dp[i][j-1] // 单个字符匹配的情况
or dp[i][j] = dp[i][j-2] // 没有匹配的情况
*/
}
}
}
}
return dp[s.length()][p.length()];
}
}