Skip to content

Commit 23f7c7f

Browse files
左程云左程云
authored andcommitted
modify leetcode problem 10 Regular Expression Matching
1 parent 1fc718b commit 23f7c7f

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed

src/topinterviewquestions/Problem_0010_RegularExpressionMatching.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public static boolean process(char[] str, char[] pattern, int si, int pi) {
4949
if (pattern[pi] != '.' && str[si] != pattern[pi]) {
5050
return process(str, pattern, si, pi + 2);
5151
}
52+
// si 没越界 pi 没越界 pi+1 * [pi]可配[si]
5253
if (process(str, pattern, si, pi + 2)) {
5354
return true;
5455
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package topinterviewquestions;
2+
3+
// Regular Expression Matching问题,进一步做斜率优化,把枚举行为优化掉
4+
5+
public class Problem_0010_RegularExpressionMatching2 {
6+
7+
public static boolean isValid(char[] str, char[] pattern) {
8+
for (char cha : str) {
9+
if (cha == '.' || cha == '*') {
10+
return false;
11+
}
12+
}
13+
for (int i = 0; i < pattern.length; i++) {
14+
if (pattern[i] == '*' && (i == 0 || pattern[i - 1] == '*')) {
15+
return false;
16+
}
17+
}
18+
return true;
19+
}
20+
21+
public static boolean isMatch1(String s, String p) {
22+
if (s == null || p == null) {
23+
return false;
24+
}
25+
char[] str = s.toCharArray();
26+
char[] pattern = p.toCharArray();
27+
return isValid(str, pattern) && process(str, pattern, 0, 0);
28+
}
29+
30+
public static boolean process(char[] str, char[] pattern, int si, int pi) {
31+
if (si == str.length) { // si越界了
32+
if (pi == pattern.length) {
33+
return true;
34+
}
35+
if (pi + 1 < pattern.length && pattern[pi + 1] == '*') {
36+
return process(str, pattern, si, pi + 2);
37+
}
38+
return false;
39+
}
40+
// si 没越界
41+
if (pi == pattern.length) {
42+
return si == str.length;
43+
}
44+
// si 没越界 pi 没越界
45+
if (pi + 1 >= pattern.length || pattern[pi + 1] != '*') {
46+
return ((str[si] == pattern[pi]) || (pattern[pi] == '.')) && process(str, pattern, si + 1, pi + 1);
47+
}
48+
// si 没越界 pi 没越界 pi+1 *
49+
if (pattern[pi] != '.' && str[si] != pattern[pi]) {
50+
return process(str, pattern, si, pi + 2);
51+
}
52+
if (process(str, pattern, si, pi + 2)) {
53+
return true;
54+
}
55+
if (si + 1 >= str.length || str[si] != str[si + 1] && (pattern[pi] != '.')) {
56+
return process(str, pattern, si + 1, pi + 2);
57+
}
58+
if (process(str, pattern, si + 1, pi)) {
59+
return true;
60+
}
61+
return false;
62+
}
63+
64+
public static boolean isMatch2(String s, String exp) {
65+
if (s == null || exp == null) {
66+
return false;
67+
}
68+
char[] str = s.toCharArray();
69+
char[] pattern = exp.toCharArray();
70+
if (!isValid(str, pattern)) {
71+
return false;
72+
}
73+
boolean[][] dp = initDPMap(str, pattern);
74+
for (int si = str.length - 1; si >= 0; si--) {
75+
for (int pi = pattern.length - 2; pi >= 0; pi--) {
76+
if (pattern[pi + 1] != '*') {
77+
dp[si][pi] = ((str[si] == pattern[pi]) || (pattern[pi] == '.')) && dp[si + 1][pi + 1];
78+
} else {
79+
if (pattern[pi] != '.' && str[si] != pattern[pi]) {
80+
dp[si][pi] = dp[si][pi + 2];
81+
} else {
82+
if (dp[si][pi + 2]) {
83+
dp[si][pi] = dp[si][pi + 2];
84+
} else {
85+
if (si + 1 >= str.length || str[si] != str[si + 1] && (pattern[pi] != '.')) {
86+
dp[si][pi] = dp[si + 1][pi + 2];
87+
} else {
88+
dp[si][pi] = dp[si + 1][pi];
89+
}
90+
}
91+
}
92+
}
93+
}
94+
}
95+
return dp[0][0];
96+
}
97+
98+
public static boolean[][] initDPMap(char[] s, char[] e) {
99+
int slen = s.length;
100+
int elen = e.length;
101+
boolean[][] dp = new boolean[slen + 1][elen + 1];
102+
dp[slen][elen] = true;
103+
for (int j = elen - 2; j > -1; j = j - 2) {
104+
if (e[j] != '*' && e[j + 1] == '*') {
105+
dp[slen][j] = true;
106+
} else {
107+
break;
108+
}
109+
}
110+
if (slen > 0 && elen > 0) {
111+
if ((e[elen - 1] == '.' || s[slen - 1] == e[elen - 1])) {
112+
dp[slen - 1][elen - 1] = true;
113+
}
114+
}
115+
return dp;
116+
}
117+
118+
}

0 commit comments

Comments
 (0)