1
1
H
2
- 1519368767
3
- tags : String , DP , Backtracking , Greedy
2
+ 1534348528
3
+ tags : String , DP , Sequence DP , Double Sequence DP , Backtracking , Greedy
4
4
5
5
Double sequence DP . 与regular expression 很像 .
6
6
7
- 注意1 : 分析字符 ?, * 所代表的真正意义 , 然后写出表达式 .
8
- 注意2 : 搞清楚initialization 的时候 dp [i ][0 ] 应该always false .当p为empty string , 无论如何都match不了 (除非s ="" as well )
9
- 同时 dp [0 ][j ]不一定是false . 比如s ="" ,p ="*" 就是一个matching .
7
+ #### Double Sequence DP
8
+ - 分析字符 ?, * 所代表的真正意义 , 然后写出表达式 .
9
+ - 搞清楚initialization 的时候 dp [i ][0 ] 应该always false . 当p为empty string , 无论如何都match不了 (除非s ="" as well )
10
+ - 同时 dp [0 ][j ]不一定是false . 比如s ="" ,p ="*" 就是一个matching .
11
+ - A . p [j ] != '*'
12
+ 1. last index match => dp [i - 1 ][j - 1 ]
13
+ 2. last index == ? => dp [i - 1 ][j - 1 ]
14
+ - B . p [j ] == "*"
15
+ 1. * is empty => dp [i ][j - 1 ]
16
+ 2. * match 1 or more chars => dp [i - 1 ][j ]
17
+
10
18
11
19
```
12
20
/*
@@ -51,17 +59,12 @@ Time,Space O(MN)
51
59
*/
52
60
class Solution {
53
61
public boolean isMatch (String s , String p ) {
54
- if (s == null || p == null ) {
55
- return false ;
56
- }
57
- int m = s .length ();
58
- int n = p .length ();
62
+ if (s == null || p == null ) return false ;
63
+ int m = s .length (), n = p .length ();
59
64
boolean [][] dp = new boolean [m + 1 ][n + 1 ];
60
65
char [] ss = s .toCharArray ();
61
66
char [] pp = p .toCharArray ();
62
67
63
- // dp[0][j] = false; dp[i][0] = false;
64
-
65
68
for (int i = 0 ; i <= m ; i ++) {
66
69
for (int j = 0 ; j <= n ; j ++) {
67
70
if (i == 0 && j == 0 ) {
@@ -75,7 +78,7 @@ public boolean isMatch(String s, String p) {
75
78
dp [i ][j ] = false ;
76
79
if (pp [j - 1 ] != '*' ) {
77
80
if (i >= 1 && (ss [i - 1 ] == pp [j - 1 ] || pp [j - 1 ] == '?' )) {
78
- dp [i ][j ] = dp [i - 1 ][j - 1 ];
81
+ dp [i ][j ] | = dp [i - 1 ][j - 1 ];
79
82
}
80
83
} else {
81
84
dp [i ][j ] |= dp [i ][j - 1 ];// '*' -> empty
0 commit comments