@@ -75,48 +75,44 @@ p = "mis*is*p*."
75
75
``` python
76
76
class Solution :
77
77
def isMatch (self , s : str , p : str ) -> bool :
78
- m, n = len (s) + 1 , len (p) + 1
79
- if n == 1 :
80
- return m == 1
81
- dp = [[False for _ in range (n)] for _ in range (m)]
82
- dp[0 ][0 ], dp[ 0 ][ 1 ] = True , False
83
- for j in range (2 , n):
78
+ m, n = len (s), len (p)
79
+ if n == 0 :
80
+ return m == 0
81
+ dp = [[False ] * (n + 1 ) for _ in range (m + 1 )]
82
+ dp[0 ][0 ] = True
83
+ for j in range (2 , n + 1 ):
84
84
if p[j - 1 ] == ' *' :
85
85
dp[0 ][j] = dp[0 ][j - 2 ]
86
- for i in range (1 , m):
87
- for j in range (1 , n):
86
+ for i in range (1 , m + 1 ):
87
+ for j in range (1 , n + 1 ):
88
88
if s[i - 1 ] == p[j - 1 ] or p[j - 1 ] == ' .' :
89
89
dp[i][j] = dp[i - 1 ][j - 1 ]
90
90
elif p[j - 1 ] == ' *' :
91
91
if p[j - 2 ] == ' .' or p[j - 2 ] == s[i - 1 ]:
92
92
dp[i][j] = dp[i][j - 2 ] or dp[i - 1 ][j]
93
93
else :
94
94
dp[i][j] = dp[i][j - 2 ]
95
- else :
96
- dp[i][j] = False
97
- return dp[m - 1 ][n - 1 ]
98
-
95
+ return dp[- 1 ][- 1 ]
99
96
```
100
97
101
98
### ** Java**
102
99
103
100
``` java
104
101
class Solution {
105
102
public boolean isMatch (String s , String p ) {
106
- int m = s. length() + 1 , n = p. length() + 1 ;
107
- if (n == 1 ) {
108
- return m == 1 ;
103
+ int m = s. length(), n = p. length();
104
+ if (n == 0 ) {
105
+ return m == 0 ;
109
106
}
110
107
boolean [][] dp = new boolean [m + 1 ][n + 1 ];
111
108
dp[0 ][0 ] = true ;
112
- dp[0 ][1 ] = false ;
113
- for (int j = 1 ; j < n; ++ j) {
109
+ for (int j = 1 ; j < n + 1 ; ++ j) {
114
110
if (p. charAt(j - 1 ) == ' *' ) {
115
111
dp[0 ][j] = dp[0 ][j - 2 ];
116
112
}
117
113
}
118
- for (int i = 1 ; i < m; ++ i) {
119
- for (int j = 1 ; j < n; ++ j) {
114
+ for (int i = 1 ; i < m + 1 ; ++ i) {
115
+ for (int j = 1 ; j < n + 1 ; ++ j) {
120
116
if (s. charAt(i - 1 ) == p. charAt(j - 1 ) || p. charAt(j - 1 ) == ' .' ) {
121
117
dp[i][j] = dp[i - 1 ][j - 1 ];
122
118
} else if (p. charAt(j - 1 ) == ' *' ) {
@@ -125,16 +121,82 @@ class Solution {
125
121
} else {
126
122
dp[i][j] = dp[i][j - 2 ];
127
123
}
128
- } else {
129
- dp[i][j] = false ;
130
124
}
131
125
}
132
126
}
133
- return dp[m - 1 ][n - 1 ];
127
+ return dp[m][n];
134
128
}
135
129
}
136
130
```
137
131
132
+ ### ** C++**
133
+
134
+ ``` cpp
135
+ class Solution {
136
+ public:
137
+ bool isMatch(string s, string p) {
138
+ int m = s.size(), n = p.size();
139
+ if (n == 0) return m == 0;
140
+ vector<vector<bool >> dp(m + 1, vector<bool >(n + 1, false));
141
+ dp[ 0] [ 0 ] = true;
142
+ for (int j = 1; j < n + 1; ++j) {
143
+ if (p[ j - 1] == '* ') {
144
+ dp[ 0] [ j ] = dp[ 0] [ j - 2 ] ;
145
+ }
146
+ }
147
+ for (int i = 1; i < m + 1; ++i) {
148
+ for (int j = 1; j < n + 1; ++j) {
149
+ if (s[ i - 1] == p[ j - 1] || p[ j - 1] == '.') {
150
+ dp[ i] [ j ] = dp[ i - 1] [ j - 1 ] ;
151
+ } else if (p[ j - 1] == '* ') {
152
+ if (s[ i - 1] == p[ j - 2] || p[ j - 2] == '.') {
153
+ dp[ i] [ j ] = dp[ i] [ j - 2 ] || dp[ i - 1] [ j ] ;
154
+ } else {
155
+ dp[ i] [ j ] = dp[ i] [ j - 2 ] ;
156
+ }
157
+ }
158
+ }
159
+ }
160
+ return dp[ m] [ n ] ;
161
+ }
162
+ };
163
+ ```
164
+
165
+ ### **Go**
166
+
167
+ ```go
168
+ func isMatch(s string, p string) bool {
169
+ m, n := len(s), len(p)
170
+ if n == 0 {
171
+ return m == 0
172
+ }
173
+ dp := make([][]bool, m+1)
174
+ for i := 0; i < m+1; i++ {
175
+ dp[i] = make([]bool, n+1)
176
+ }
177
+ dp[0][0] = true
178
+ for j := 1; j < n+1; j++ {
179
+ if p[j-1] == '*' {
180
+ dp[0][j] = dp[0][j-2]
181
+ }
182
+ }
183
+ for i := 1; i < m+1; i++ {
184
+ for j := 1; j < n+1; 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
+ if s[i-1] == p[j-2] || p[j-2] == '.' {
189
+ dp[i][j] = dp[i][j-2] || dp[i-1][j]
190
+ } else {
191
+ dp[i][j] = dp[i][j-2]
192
+ }
193
+ }
194
+ }
195
+ }
196
+ return dp[m][n]
197
+ }
198
+ ```
199
+
138
200
### ** JavaScript**
139
201
140
202
``` js
@@ -163,46 +225,6 @@ var isMatch = function (s, p) {
163
225
};
164
226
```
165
227
166
- ### ** C++**
167
-
168
- ``` cpp
169
- class Solution {
170
- public:
171
- bool match(string s, string p, int sl, int pl) {
172
- /* 说明:sl指的是s的len,pl指的是p的len。
173
- 使用这种写法,在牛客上是能ac的。在leetcode上会显示特定的用例超时。
174
- 写在这里,给大家提供一种新的思路吧。
175
- 二维动态规划应该更适合做这一题的题解(参考java版本答案) * /
176
- if (sl == s.size() && pl == p.size()) {
177
- return true;
178
- }
179
-
180
- if (sl < s.size() && pl == p.size()) {
181
- return false;
182
- }
183
-
184
- if (p[pl+1 ] != ' *' ) {
185
- // 如果p的下一个不是*的情况
186
- if ((s[sl] == p[pl]) || (sl<s.size() && p[pl] == '.')) {
187
- return match(s, p, sl+1, pl+1);
188
- } else {
189
- return false;
190
- }
191
- } else {
192
- if ((s[sl] == p[pl]) || (sl<s.size() && p[pl] == '.')) {
193
- return match(s, p, sl, pl+2) || match(s, p, sl+1, pl);
194
- } else {
195
- return match(s, p, sl, pl+2);
196
- }
197
- }
198
- }
199
-
200
- bool isMatch(string s, string p) {
201
- return match(s, p, 0, 0);
202
- }
203
- };
204
- ```
205
-
206
228
### ** ...**
207
229
208
230
```
0 commit comments