LeetCode刷题-72. 编辑距离
题目链接:72. 编辑距离
¶题解:
动态规划应用,很有意思!
¶题目简述:
将一个单词变为另一个单词,只有三种操作,替换,删除,插入!问最少步数!
¶题解:
动态规划:
状态表示: 两个字符串,使用二维数组f[i][j]
表示a
字符串的的0 - i
和b
字符串的 0 - j
匹配时的最少步数!
状态计算: 处理最后一步, 三种情况
- 删除一个字符:
f[i][j] = f[i - 1][j] + 1
即a
字符串删除一个会匹配,则a
字符串的前i - 1
个是和b
字符串的前j
个匹配,所以当前最少步数就是该匹配最少步数加一(当前删除操作的一步) - 插入一个字符:
f[i][j] = f[i][j - 1] + 1
解释:与上面同理 - 替换一个字符:两种情况
a[i] == b[j]
:即该字符已经匹配无需替换,f[i - 1][j - 1] + 0
a[i] != b[j]
:即该字符已经匹配需要替换,f[i - 1][j - 1] + 1
综上所述: 状态转移方程为:f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1; f[i][j] = min(f[i][j], f[i - 1][j - 1] + t);
最终答案: f[n][m]
表示a
字符串变为b
字符串的最少步数!
初始化: f[i][0] = i, f[0][j] = j
即一个为空,一个不空,则最少需要不空的长度才可以转变为一样
注意:
- 为了不对边界0的处理,字符串都在最前端加一个空格!
时间复杂度: O(n)
¶AC代码:
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小牛博客!
评论