Skip to content

Commit 4647472

Browse files
左程云左程云
authored andcommitted
补充题目10枚举行为优化的解并注释说明
1 parent 6443f5e commit 4647472

File tree

1 file changed

+29
-27
lines changed

1 file changed

+29
-27
lines changed

src/topinterviewquestions/Problem_0010_RegularExpressionMatching.java

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ public static boolean process2(char[] str, char[] pattern, int si, int pi, int[]
141141
}
142142

143143
// 以下的代码是课后的优化
144-
// 有代码逻辑精简的优化,还包含一个重要的斜率优化,请先理解课上的内容
144+
// 有代码逻辑精简的优化,还包含一个重要的枚举行为优化
145+
// 请先理解课上的内容
145146
public static boolean isMatch3(String s, String p) {
146147
if (s == null || p == null) {
147148
return false;
@@ -151,33 +152,34 @@ public static boolean isMatch3(String s, String p) {
151152
return isValid(str, pattern) && process3(str, pattern, 0, 0);
152153
}
153154

154-
// 举例说明斜率优化:
155+
// 举例说明枚举行为优化
155156
// 求状态(si = 3, pi = 7)时,假设状况如下
156-
// str : a a a b ...
157-
// si : 3 4 5 6 ...
158-
// pat : a * ? ...
159-
// pi : 7 8 9 ...
160-
// 状态(si = 3, pi = 7)的底层会依赖
161-
// 状态(si = 3, pi = 9)
162-
// 状态(si = 4, pi = 9)
163-
// 状态(si = 5, pi = 9)
164-
// 状态(si = 6, pi = 9)
157+
// str : a a a b ...
158+
// si : 3 4 5 6 ...
159+
// pat : a * ? ...
160+
// pi : 7 8 9 ...
161+
// 状态(si = 3, pi = 7)会依赖
162+
// 状态(si = 3, pi = 9)
163+
// 状态(si = 4, pi = 9)
164+
// 状态(si = 5, pi = 9)
165+
// 状态(si = 6, pi = 9)
165166
//
166167
// 求状态(si = 2, pi = 7)时,假设状况如下
167-
// str : a a a a b ...
168-
// si : 2 3 4 5 6 ...
169-
// pat : a * ? ...
170-
// pi : 7 8 9 ...
171-
// 状态(si = 2, pi = 7)的底层会依赖:
172-
// 状态(si = 2, pi = 9)
173-
// 状态(si = 3, pi = 9)
174-
// 状态(si = 4, pi = 9)
175-
// 状态(si = 5, pi = 9)
176-
// 状态(si = 6, pi = 9)
177-
//
178-
// 注意看状态(si = 2, pi = 7)底层依赖的后4个,其实就是状态(si = 3, pi = 7)
179-
// 所以,状态(si = 2, pi = 7)的底层依赖可以化简为:
180-
// 状态(si = 2, pi = 9)、状态(si = 3, pi = 7)
168+
// str : a a a a b ...
169+
// si : 2 3 4 5 6 ...
170+
// pat : a * ? ...
171+
// pi : 7 8 9 ...
172+
// 状态(si = 2, pi = 7)会依赖:
173+
// 状态(si = 2, pi = 9)
174+
// 状态(si = 3, pi = 9)
175+
// 状态(si = 4, pi = 9)
176+
// 状态(si = 5, pi = 9)
177+
// 状态(si = 6, pi = 9)
178+
//
179+
// 注意看状态(si = 2, pi = 7)依赖的后4个,其实就是状态(si = 3, pi = 7)
180+
// 所以状态(si = 2, pi = 7)的依赖可以化简为:
181+
// 状态(si = 2, pi = 9)
182+
// 状态(si = 3, pi = 7)
181183
// 这样枚举行为就被化简成了有限两个状态,详细情况看代码
182184
public static boolean process3(char[] str, char[] pattern, int si, int pi) {
183185
if (si == str.length && pi == pattern.length) {
@@ -192,14 +194,14 @@ public static boolean process3(char[] str, char[] pattern, int si, int pi) {
192194
if (pi + 1 >= pattern.length || pattern[pi + 1] != '*') {
193195
return ((str[si] == pattern[pi]) || (pattern[pi] == '.')) && process3(str, pattern, si + 1, pi + 1);
194196
}
195-
// 此处为斜率优化,含义看函数注释
197+
// 此处为枚举行为优化,含义看函数注释
196198
if ((str[si] == pattern[pi] || pattern[pi] == '.') && process3(str, pattern, si + 1, pi)) {
197199
return true;
198200
}
199201
return process3(str, pattern, si, pi + 2);
200202
}
201203

202-
// 以下的代码是斜率优化后的尝试函数,改成动态规划的解
204+
// 以下的代码是枚举行为优化后的尝试函数,改成动态规划的解
203205
// 请先理解基础班中"暴力递归改动态规划"的内容
204206
// 如果str长度为N,pattern长度为M,最终时间复杂度为O(N*M)
205207
public static boolean isMatch4(String str, String pattern) {

0 commit comments

Comments
 (0)