72.编辑距离-python
72.编辑距离(困难)
题目大意:
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
题目
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例1:
1 |
|
示例2:
1 |
|
提示:
- 0 <= word1.length, word2.length <= 500
- word1 和 word2 由小写英文字母组成
题目分析和解答
二维dp的题目,想象两个单词word1和word2,二维dp的每个位置上,代表word1的i位置处,和word2的j位置处情况下,多少次变换能达到是一样的情况;
个人习惯上把word1作为行来放置,把word2作为列来放置;
由于word1和word2都可能为空,所以在初始化二维dp数组的时候,行和列要分别是len(word1)+1
和len(word2)+1
,初始化dp数组的第一行第一列,想象i到j的这个顺序,第一列dp[i][0]
代表word1在当前的情况下经过多少次操作能变成空,所以这个数值就等于i;第一行dp[0][i]
就是代表空字符串经过多少次能变到word2的当前这个位置上。
现在初始化好了dp数组的第一行第一列,下边就来想状态转移这个方程,也是这个题目每次复习的时候需要想到的部分,dp[i][j]
可以由dp[i-1][j-1],dp[i-1][j],dp[i][j-1]
得到:
dp[i-1][j-1]
到dp[i][j]
的操作是修改,注意修改这个操作需要判断word1 i位置处的值和word2 j位置处的值是不是相等的,如果相等的话则不需要修改,如果是不相等的话则需要修改,也就是dp[i-1][j-1]+1
;dp[i][j-1]
到dp[i][j]
的操作是删除,想象最左上角的三个块,ij代表word1变到word2的这一种感觉。执行删除的情况下,状态转移后必然是dp[i][j]=dp[i][j-1]+1
;dp[i-1][j]
到dp[i][j]
的操作是新增,同样是想象最左上角的三个块。执行新增的情况下,状态转移后必然是dp[i][j]=dp[i-1][j]+1
经过如上分析后,在每次判断时先判断是不是相等,如果相等的话,可以走dp[i][j]=dp[i-1][j-1]
,代表不需要修改。如果是不相等的话就需要对三种情况进行min判断,dp[i][j]=min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]) + 1
经过上述循环后,因为在最开始前边补充的字符串为空的长度情况,所以dp[len(word1)][len(word2)]
就可以了。
1 |
|