-
前言
状态:115 不会、583 根据 115AC、72 不会 -
更新
1 | 24-07-08 初始记录 |
初步题解
115 不同的子序列
题目链接:(https://leetcode.cn/problems/distinct-subsequences/)
583 两个字符串的删除操作
题目链接:(https://leetcode.cn/problems/delete-operation-for-two-strings/)
-
确定
dp[i][j]
的含义:s 到 i - 1;t 到 j - 1 位置的删除相同需要的最小步数。 -
递推公式:如果当前位置元素相同:
dp[i][j] = dp[i - 1][j - 1];
(即不加这个元素时的子序列个数 + 加上这个元素的子序列个数), 如果当前位置元素不同:dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
(画图即当前位置的上左再去除一个元素并取较小值)。 -
dp 数组的初始化:
dp[i][0]
、dp[0][j]
都是与元素个数有关。 -
遍历顺序:从上到下,从左到右。
-
打印 dp 数组(用于 debug)
1 | public int minDistance(String word1, String word2) { |
72 编辑距离
题目链接:(https://leetcode.cn/problems/edit-distance)
看解析
115 不同的子序列
解析:(https://programmercarl.com/0115.不同的子序列.html)
-
确定
dp[i][j]
的含义:s 到 i - 1;t 到 j - 1 位置的子序列个数。 -
递推公式:如果当前位置元素相同:
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
(即不加这个元素时的子序列个数 + 加上这个元素的子序列个数), 如果当前位置元素不同:dp[i][j] = dp[i - 1][j];
。 -
dp 数组的初始化:
dp[i][0]
一定都是 1,因为也就是把以 i-1 为结尾的 s,删除所有元素,出现空字符串的个数就是 1。dp[0][j]
一定都是 0。dp[0][0]
应该是 1。 -
遍历顺序:从上到下,从左到右。
-
打印 dp 数组(用于 debug)
1 | public int numDistinct(String s, String t) { |
583 两个字符串的删除操作
解析:(https://programmercarl.com/0583.两个字符串的删除操作.html)
72 编辑距离
解析:(https://programmercarl.com/0072.编辑距离.html)
-
确定
dp[i][j]
的含义:word1 到 i - 1;word2 到 j - 1 位置的最小编辑数。 -
递推公式:需要确认四种情况:
word1[i - 1] == word2[j - 1]
时,不操作;word1[i - 1] != word2[j - 1]
,增删换。具体公式看代码。 -
dp 数组的初始化:
dp[i][0]
、dp[0][j]
都是与元素个数有关,即删除所有元素。 -
遍历顺序:从上到下,从左到右。
-
打印 dp 数组(用于 debug)
1 | public int minDistance(String word1, String word2) { |