1
- using System . Linq ;
2
-
3
1
public class Solution {
2
+ private bool ? [ , ] f ;
3
+ private char [ ] s ;
4
+ private char [ ] p ;
5
+ private int m ;
6
+ private int n ;
7
+
4
8
public bool IsMatch ( string s , string p ) {
5
- if ( p . Count ( ch => ch != '*' ) > s . Length )
6
- {
9
+ this . s = s . ToCharArray ( ) ;
10
+ this . p = p . ToCharArray ( ) ;
11
+ m = s . Length ;
12
+ n = p . Length ;
13
+ f = new bool ? [ m , n ] ;
14
+ return Dfs ( 0 , 0 ) ;
15
+ }
16
+
17
+ private bool Dfs ( int i , int j ) {
18
+ if ( i >= m ) {
19
+ return j >= n || ( p [ j ] == '*' && Dfs ( i , j + 1 ) ) ;
20
+ }
21
+ if ( j >= n ) {
7
22
return false ;
8
23
}
9
-
10
- bool [ , ] f = new bool [ s . Length + 1 , p . Length + 1 ] ;
11
- bool [ ] d = new bool [ s . Length + 1 ] ; // d[i] means f[0, j] || f[1, j] || ... || f[i, j]
12
- for ( var j = 0 ; j <= p . Length ; ++ j )
13
- {
14
- d [ 0 ] = j == 0 ? true : d [ 0 ] && p [ j - 1 ] == '*' ;
15
- for ( var i = 0 ; i <= s . Length ; ++ i )
16
- {
17
- if ( j == 0 )
18
- {
19
- f [ i , j ] = i == 0 ;
20
- continue ;
21
- }
22
-
23
- if ( p [ j - 1 ] == '*' )
24
- {
25
- if ( i > 0 )
26
- {
27
- d [ i ] = f [ i , j - 1 ] || d [ i - 1 ] ;
28
- }
29
- f [ i , j ] = d [ i ] ;
30
- }
31
- else if ( p [ j - 1 ] == '?' )
32
- {
33
- f [ i , j ] = i > 0 && f [ i - 1 , j - 1 ] ;
34
- }
35
- else
36
- {
37
- f [ i , j ] = i > 0 && f [ i - 1 , j - 1 ] && s [ i - 1 ] == p [ j - 1 ] ;
38
- }
39
- }
24
+ if ( f [ i , j ] != null ) {
25
+ return f [ i , j ] . Value ;
26
+ }
27
+ if ( p [ j ] == '*' ) {
28
+ f [ i , j ] = Dfs ( i + 1 , j ) || Dfs ( i + 1 , j + 1 ) || Dfs ( i , j + 1 ) ;
29
+ } else {
30
+ f [ i , j ] = ( p [ j ] == '?' || s [ i ] == p [ j ] ) && Dfs ( i + 1 , j + 1 ) ;
40
31
}
41
- return f [ s . Length , p . Length ] ;
32
+ return f [ i , j ] . Value ;
42
33
}
43
- }
34
+ }
0 commit comments