参考liweiwei题解:. - 力扣(LeetCode)
题目
解题思路:
直接思考,从一个字符串到另一个字符串的变化,是一步一步来的,可以分解
例如:
- horse -> rorse (将 'h' 替换为 'r')
- rorse -> rose (删除 'r')
- rose -> ros (删除 'e')
可以想到动态规划
第一步: 分析数组含义
dp[i][j] 为word1[0..i]到word2[0...j]最少步骤 --- 将word1变为word2最少步骤拆分为子问题
第二步: 创建状态转移方程
第一种情况: 最后一个字符相等的情况
由于最后一个字符相等,则可以直接考虑除最后一个字符之前的情况
因此dp[i][j] = dp[i-1][j-1]
第二种情况: 最后一个字符并不相等
由于最后一个字符不相等,我们得将他变为相等.
这样从字符串开头时,将会一步一步保证引用之前的字符串已经相等
分析三种操作
插入
插入一个字符,使得两个字符串最后一个字符相等
正常来说应该是dp[i][j] = dp[i + 1][j] + 1
但由于我们是进行的i(外层),j(内层),因此i+1的下标是空的,没有数据
word1插入字符,相当于接下来要比较word1[0....i]和word2[0...j-1]
因此可以将方程改为dp[i][j] = dp[i][j-1] + 1
删除
删去word1[i]的操作可以视作为word2[j+1]插入word1[i]字符,使得他们最后一个字符相等
例如: word1 doge,word2 dog,word1删去'e'和word2加上'e'结果是相同的
因此可以视作是word2加上一个字符,只需比较word2[j]和word1[i-1]即可
修改
修改十分好理解,即word1[i] 和word2[j]以强制相同,则只需得知word1[i-1]和word2[j-1]之前的字符串编辑距离即可
第三步: 考虑初始化
从一个字符串变成空字符串,非空字符串的长度就是编辑距离。因此初始化逻辑如下:
for (int i = 0; i <= len1; i++) {
dp[i][0] = i;
}
for (int j = 0; j <= len2; j++) {
dp[0][j] = j;
}