@@ -211,41 +211,41 @@ func isMatch(s string, p string) bool {
211
211
212
212
``` rust
213
213
impl Solution {
214
- #[allow(dead_code)]
215
214
pub fn is_match (s : String , p : String ) -> bool {
216
- let n = s . len ();
217
- let m = p . len ();
218
- let s = s . chars (). collect :: <Vec <char >>();
219
- let p = p . chars (). collect :: <Vec <char >>();
220
-
221
- let mut dp = vec! [vec! [false ; m + 1 ]; n + 1 ];
222
-
223
- // Initialize the dp vector
224
- dp [0 ][0 ] = true ;
225
-
226
- for i in 1 ..= m {
227
- if p [i - 1 ] == '*' {
228
- dp [0 ][i ] = dp [0 ][i - 2 ];
215
+ let (m , n ) = (s . len (), p . len ());
216
+ let mut f = vec! [vec! [0 ; n + 1 ]; m + 1 ];
217
+
218
+ fn dfs (
219
+ s : & Vec <char >,
220
+ p : & Vec <char >,
221
+ f : & mut Vec <Vec <i32 >>,
222
+ i : usize ,
223
+ j : usize ,
224
+ m : usize ,
225
+ n : usize
226
+ ) -> bool {
227
+ if j >= n {
228
+ return i == m ;
229
229
}
230
- }
231
-
232
- // Begin the actual dp process
233
- for i in 1 ..= n {
234
- for j in 1 ..= m {
235
- if s [i - 1 ] == p [j - 1 ] || p [j - 1 ] == '.' {
236
- dp [i ][j ] = dp [i - 1 ][j - 1 ];
237
- }
238
- if p [j - 1 ] == '*' {
239
- if j >= 2 && (s [i - 1 ] == p [j - 2 ] || p [j - 2 ] == '.' ) {
240
- dp [i ][j ] = dp [i - 1 ][j ] || dp [i ][j - 2 ];
241
- } else if j >= 2 && s [i - 1 ] != p [j - 2 ] {
242
- dp [i ][j ] = dp [i ][j - 2 ];
243
- }
230
+ if f [i ][j ] != 0 {
231
+ return f [i ][j ] == 1 ;
232
+ }
233
+ let mut res = - 1 ;
234
+ if j + 1 < n && p [j + 1 ] == '*' {
235
+ if
236
+ dfs (s , p , f , i , j + 2 , m , n ) ||
237
+ (i < m && (s [i ] == p [j ] || p [j ] == '.' ) && dfs (s , p , f , i + 1 , j , m , n ))
238
+ {
239
+ res = 1 ;
244
240
}
241
+ } else if i < m && (s [i ] == p [j ] || p [j ] == '.' ) && dfs (s , p , f , i + 1 , j + 1 , m , n ) {
242
+ res = 1 ;
245
243
}
244
+ f [i ][j ] = res ;
245
+ res == 1
246
246
}
247
247
248
- dp [ n ][ m ]
248
+ dfs ( & s . chars () . collect (), & p . chars () . collect (), & mut f , 0 , 0 , m , n )
249
249
}
250
250
}
251
251
```
@@ -443,6 +443,38 @@ func isMatch(s string, p string) bool {
443
443
}
444
444
```
445
445
446
+ #### Rust
447
+
448
+ ``` rust
449
+ impl Solution {
450
+ pub fn is_match (s : String , p : String ) -> bool {
451
+ let m = s . len ();
452
+ let n = p . len ();
453
+ let mut f = vec! [vec! [false ; n + 1 ]; m + 1 ];
454
+
455
+ f [0 ][0 ] = true ;
456
+
457
+ let s : Vec <char > = s . chars (). collect ();
458
+ let p : Vec <char > = p . chars (). collect ();
459
+
460
+ for i in 0 ..= m {
461
+ for j in 1 ..= n {
462
+ if p [j - 1 ] == '*' {
463
+ f [i ][j ] = f [i ][j - 2 ];
464
+ if i > 0 && (p [j - 2 ] == '.' || p [j - 2 ] == s [i - 1 ]) {
465
+ f [i ][j ] = f [i ][j ] || f [i - 1 ][j ];
466
+ }
467
+ } else if i > 0 && (p [j - 1 ] == '.' || p [j - 1 ] == s [i - 1 ]) {
468
+ f [i ][j ] = f [i - 1 ][j - 1 ];
469
+ }
470
+ }
471
+ }
472
+
473
+ f [m ][n ]
474
+ }
475
+ }
476
+ ```
477
+
446
478
#### JavaScript
447
479
448
480
``` js
0 commit comments