@@ -67,22 +67,130 @@ p = "a*c?b"
67
67
68
68
<!-- 这里可写通用的实现逻辑 -->
69
69
70
+ ** 方法一:动态规划**
71
+
72
+ 定义状态 $dp[ i] [ j ] $ 表示 $s$ 的前 $i$ 个字符和 $p$ 的前 $j$ 个字符是否匹配。
73
+
74
+ 状态转移方程如下:
75
+
76
+ $$
77
+ dp[i][j]=
78
+ \begin{cases}
79
+ dp[i-1][j-1] & \text{if } s[i-1]=p[j-1] \text{ or } p[j-1]=\text{?} \\
80
+ dp[i-1][j-1] \lor dp[i-1][j] \lor dp[i][j-1] & \text{if } p[j-1]=\text{*} \\
81
+ \text{false} & \text{otherwise}
82
+ \end{cases}
83
+ $$
84
+
85
+ 时间复杂度 $O(m\times n)$,空间复杂度 $O(m\times n)$。
86
+
70
87
<!-- tabs:start -->
71
88
72
89
### ** Python3**
73
90
74
91
<!-- 这里可写当前语言的特殊实现逻辑 -->
75
92
76
93
``` python
77
-
94
+ class Solution :
95
+ def isMatch (self , s : str , p : str ) -> bool :
96
+ m, n = len (s), len (p)
97
+ dp = [[False ] * (n + 1 ) for _ in range (m + 1 )]
98
+ dp[0 ][0 ] = True
99
+ for j in range (1 , n + 1 ):
100
+ if p[j - 1 ] == ' *' :
101
+ dp[0 ][j] = dp[0 ][j - 1 ]
102
+ for i in range (1 , m + 1 ):
103
+ for j in range (1 , n + 1 ):
104
+ if s[i - 1 ] == p[j - 1 ] or p[j - 1 ] == ' ?' :
105
+ dp[i][j] = dp[i - 1 ][j - 1 ]
106
+ elif p[j - 1 ] == ' *' :
107
+ dp[i][j] = dp[i - 1 ][j] or dp[i][j - 1 ]
108
+ return dp[m][n]
78
109
```
79
110
80
111
### ** Java**
81
112
82
113
<!-- 这里可写当前语言的特殊实现逻辑 -->
83
114
84
115
``` java
116
+ class Solution {
117
+ public boolean isMatch (String s , String p ) {
118
+ int m = s. length(), n = p. length();
119
+ boolean [][] dp = new boolean [m + 1 ][n + 1 ];
120
+ dp[0 ][0 ] = true ;
121
+ for (int j = 1 ; j <= n; ++ j) {
122
+ if (p. charAt(j - 1 ) == ' *' ) {
123
+ dp[0 ][j] = dp[0 ][j - 1 ];
124
+ }
125
+ }
126
+ for (int i = 1 ; i <= m; ++ i) {
127
+ for (int j = 1 ; j <= n; ++ j) {
128
+ if (s. charAt(i - 1 ) == p. charAt(j - 1 ) || p. charAt(j - 1 ) == ' ?' ) {
129
+ dp[i][j] = dp[i - 1 ][j - 1 ];
130
+ } else if (p. charAt(j - 1 ) == ' *' ) {
131
+ dp[i][j] = dp[i - 1 ][j] || dp[i][j - 1 ];
132
+ }
133
+ }
134
+ }
135
+ return dp[m][n];
136
+ }
137
+ }
138
+ ```
139
+
140
+ ### ** C++**
141
+
142
+ ``` cpp
143
+ class Solution {
144
+ public:
145
+ bool isMatch(string s, string p) {
146
+ int m = s.size(), n = p.size();
147
+ vector<vector<bool >> dp(m + 1, vector<bool >(n + 1));
148
+ dp[ 0] [ 0 ] = true;
149
+ for (int j = 1; j <= n; ++j) {
150
+ if (p[ j - 1] == '* ') {
151
+ dp[ 0] [ j ] = dp[ 0] [ j - 1 ] ;
152
+ }
153
+ }
154
+ for (int i = 1; i <= m; ++i) {
155
+ for (int j = 1; j <= n; ++j) {
156
+ if (s[ i - 1] == p[ j - 1] || p[ j - 1] == '?') {
157
+ dp[ i] [ j ] = dp[ i - 1] [ j - 1 ] ;
158
+ } else if (p[ j - 1] == '* ') {
159
+ dp[ i] [ j ] = dp[ i - 1] [ j ] || dp[ i] [ j - 1 ] ;
160
+ }
161
+ }
162
+ }
163
+ return dp[ m] [ n ] ;
164
+ }
165
+ };
166
+ ```
85
167
168
+ ### **Go**
169
+
170
+ ```go
171
+ func isMatch(s string, p string) bool {
172
+ m, n := len(s), len(p)
173
+ dp := make([][]bool, m+1)
174
+ for i := range dp {
175
+ dp[i] = make([]bool, n+1)
176
+ }
177
+ dp[0][0] = true
178
+ for j := 1; j <= n; j++ {
179
+ if p[j-1] == '*' {
180
+ dp[0][j] = dp[0][j-1]
181
+ }
182
+ }
183
+ for i := 1; i <= m; i++ {
184
+ for j := 1; j <= n; j++ {
185
+ if s[i-1] == p[j-1] || p[j-1] == '?' {
186
+ dp[i][j] = dp[i-1][j-1]
187
+ } else if p[j-1] == '*' {
188
+ dp[i][j] = dp[i-1][j] || dp[i][j-1]
189
+ }
190
+ }
191
+ }
192
+ return dp[m][n]
193
+ }
86
194
```
87
195
88
196
### ** ...**
0 commit comments