@@ -216,26 +216,51 @@ const isSubsequence = (s, t) => {
216
216
217
217
### TypeScript:
218
218
219
+ > 二维数组
220
+
219
221
``` typescript
220
222
function isSubsequence(s : string , t : string ): boolean {
221
223
/**
222
224
dp[i][j]: s的前i-1个,t的前j-1个,最长公共子序列的长度
223
225
*/
224
- const sLen: number = s .length ,
225
- tLen: number = t .length ;
226
- const dp: number [][] = new Array (sLen + 1 ).fill (0 )
227
- . map ( _ => new Array ( tLen + 1 ). fill ( 0 ));
226
+ const sLen= s .length
227
+ const tLen= t .length
228
+ const dp: number [][] = new Array (sLen + 1 ).fill (0 ). map ( _ => new Array ( tLen + 1 ). fill ( 0 ))
229
+
228
230
for (let i = 1 ; i <= sLen ; i ++ ) {
229
231
for (let j = 1 ; j <= tLen ; j ++ ) {
230
- if (s [i - 1 ] === t [j - 1 ]) {
231
- dp [i ][j ] = dp [i - 1 ][j - 1 ] + 1 ;
232
- } else {
233
- dp [i ][j ] = Math .max (dp [i - 1 ][j ], dp [i ][j - 1 ]);
234
- }
232
+ if (s [i - 1 ] === t [j - 1 ]) dp [i ][j ] = dp [i - 1 ][j - 1 ] + 1
233
+ // 只需要取 j-2 的 dp 值即可,不用考虑 i-2
234
+ else dp [i ][j ] = dp [i ][j - 1 ]
235
235
}
236
236
}
237
- return dp [sLen ][tLen ] === s .length ;
238
- };
237
+ return dp [sLen ][tLen ] === s .length
238
+ }
239
+ ```
240
+
241
+ > 滚动数组
242
+ ``` typescript
243
+ function isSubsequence(s : string , t : string ): boolean {
244
+ const sLen = s .length
245
+ const tLen = t .length
246
+ const dp: number [] = new Array (tLen + 1 ).fill (0 )
247
+
248
+ for (let i = 1 ; i <= sLen ; i ++ ) {
249
+ let prev: number = 0 ;
250
+ let temp: number = 0 ;
251
+ for (let j = 1 ; j <= tLen ; j ++ ) {
252
+ // 备份一下当前状态(经过上层迭代后的)
253
+ temp = dp [j ]
254
+ // prev 相当于 dp[j-1](累加了上层的状态)
255
+ // 如果单纯 dp[j-1] 则不会包含上层状态
256
+ if (s [i - 1 ] === t [j - 1 ]) dp [j ] = prev + 1
257
+ else dp [j ] = dp [j - 1 ]
258
+ // 继续使用上一层状态更新参数用于当前层下一个状态
259
+ prev = temp
260
+ }
261
+ }
262
+ return dp [tLen ] === sLen
263
+ }
239
264
```
240
265
241
266
### Go:
0 commit comments