1.题目链接:583. 两个字符串的删除操作
题目描述:
给定两个单词 word1
和 word2
,返回使得 word1
和 word2
相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。
解法1:
①本题求在仅进行删除操作的前提下,使两个字符串变成相同的所需的最小的操作数目。
②明确dp[i][j]的含义,即以下标为i-1为结尾的word1和以下标为j-1为结尾的word2,使其相同需要的最小操作数为dp[i][j]。
③递推公式:
dp[i][j] = ?
1)如果ch1[i-1] == ch2[j-1]即当前元素相等的话,那么这两个元素都不用操作,所以dp[i][j] = dp[i-1][j-1];
2)如果不等的话,我们就要进行删除操作,可以删word1的也可以删word2的也可以都删,最后我们取最小值即可。所以删word1---dp[i-1][j] + 1(因为要进行一步删除操作才能完成dp[i][j]的意义,所以加1)。删word2---dp[i][j-1] + 1。全都删---dp[i-1][j-1] + 2。但其实全删和前面的各删一个是完全相等的等式,所以可以不写。
④初始化:
因为根据递推公式,都是根据上面和左边的值求得的,所以初始化dp[i][0]和dp[0][j],即表示将元素个数为i,j个的字符串变成空串需要最小操作数,就是i和j。故dp[i][0] = i, dp[0][j] = j.
⑤遍历顺序:
根据递推公式,从上到下,从左到右。
⑥最后返回dp[ch1.length][ch2.length]
下面为代码(java):
解法2:
其实本题也可以这样想,我们求出两个序列的最长公共子序列的长度,然后用两个字符串的长度相加-2*最长公共子序列的长度即可(因为只涉及到删除操作,所以可以这样解决)。
下面为代码(java):
2.题目链接:72. 编辑距离
题目描述:
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
解法:
①此题和两个字符串的删除操作不同的地方就是增加了两个其他的操作(插入,替换)
②对于相等的情况:递推公式一样即 dp[i][j] = dp[i-1][j-1]
③对于不相等的情况:
1)删除操作(等价于插入操作)--- dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1]+1,dp[i-1][j-1]+1)
2)替换操作 --- 相等情况下dp[i][j] = dp[i-1][j-1],不相等的时候要进行一步替换操作即dp[i-1][j-1]+1
④初始化和遍历顺序和最后返回结果都一样。
下面为代码(java):
3.总结:
①两个字符串的删除操作 --- 考虑相等和不相等的两个情况,相等=前面的,不相等就要删除---三种删除方式(删word1,删word2,都删)然后取最小。
②编辑距离 --- 比两个字符串的删除操作多了替换和插入操作,但是插入操作和删除操作是一样的;替换---不相等了需要一步操作即dp[i-1][j-1] + 1。