1 parent 1d1a4a4 commit b1f23cbCopy full SHA for b1f23cb
1 file changed
动态规划系列/LCS.md
@@ -242,7 +242,15 @@ class Solution {
242
243
244
245
-自底向上的解法中 `dp` 数组定义的方式和我们的递归解法有一点差异,而且由于数组索引从 0 开始,有索引偏移,不过思路和我们的递归解法完全相同,如果你看懂了递归解法,这个解法应该不难理解。
+自底向上的解法中 `dp` 数组定义的方式和我们的递归解法有一点差异,不过思路和我们的递归解法完全相同,如果你看懂了递归解法,这个解法应该不难理解。
246
+
247
+新手可能有一个注意不到的小细节: `s1.charAt(i - 1) == s2.charAt(j - 1)`,这里的字符串索引和 `dp` 数组索引并不一致,也称为**索引偏移**。回顾一下 `dp` 数组的定义:
248
249
+```java
250
+ // 定义:s1[0..i-1] 和 s2[0..j-1] 的 lcs 长度为 dp[i][j]
251
+```
252
253
+在第 `i` 轮循环中改变的是 `dp[i]` 的值,此时按照定义,需要比较的是 `s1` 的**第 i 个字符**,也即 `s1[i-1]`。`s2[j-1]` 也是同理。这种细节在字符串类动态规划中非常常见,需要多加留意。
254
255
另外,自底向上的解法可以通过我们前文讲过的 [动态规划空间压缩技巧](https://labuladong.online/algo/dynamic-programming/space-optimization/) 来进行优化,把空间复杂度压缩为 O(N),这里由于篇幅所限,就不展开了。
256
0 commit comments