小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
583. 两个字符串的删除操作
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
思路分析
这道题看起来很像:1143. 最长公共子序列(这道题之前有讲过),因为删除本身就是在删除不是公共子序列的字符,不过如果你做过动态规划的经典题目: 72. 编辑距离,计算两个单词的距离的时候,你会感到两题之间惊人的相似,只是相比之下编辑距离这道题在计算距离的时候需要考虑插入与替换多个操作。
那么这道题就很明显可以使用动态规划解决了。
动态规划首先是状态表示(动态规划知识点缺失的可以看看这里):dp[i][j] 表示strA(0,i)和strB(0,j)的距离 在这基础上,我们讨论下状态转移方程:
如果 strA[i] == strB[j],那么dp[i][j] == dp[i - 1][j -1]
如果 strA[i] != strB[j],那么可以选择:
- 删除strB[i] : dp[i][j] == dp[i][j - 1] + 1
- 删除strA[i] : dp[i][j] == dp[i - 1][j] + 1
择优选取即可。