Description:
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
题目理解,就是求将第一个字符串转化到第二个字符串所需要的最少步数,可以使用插入、删除、替换,三种策略。
这其实就是算法导论第15章,动态规划的思考题15-5,但是这道题会更加简单, 因为书上还有旋转操作。反正就是说这道题如果不使用动态规划,那么一定是过不了的。
思路一:先写一个递归算法,将它转化为自顶向上的动态规划。
思路二:自底向上。
代码一:
先考虑递归的情况,也就是取两个字符串的头字符
和 匹配,向下递归 和 。 和 不匹配,- 使用
replace
,也就是将 替换为 ,向下递归 和 。 - 使用
Insert
,也就是在 前面插入 ,向下递归 和 。 - 使用
Delete
,也就是删除 ,向下递归 和 。
- 使用
上面的递归就可以求出少的操作次数,但是这样的递归将是指数复杂度的,所以更改其变为动态规划,减少子问题的重复计算。
1 | class Solution { |
复杂度O(mn)。
运行时间8ms。
击败97.43%
代码二:
自底向上。
对照P223,定理15的定义法,先清晰一下思路。
令
- 如果
,则次数等于 。 - 如果
,则次数等于 与 与 的最小值加一。
1 | class Solution { |
复杂度O(mn)。
运行时间10ms。
击败92.12%
注:
自顶向上比自底向上快???想了一下,应该是因为在自顶向下的过程中,并不需要去将所有的子问题都计算出来。