4.6日:编辑距离(动态规划)
给你两个单词word1和word2,请你计算出将word1转换成word2所使用的最少操作数。
你可以对一个单词进行如下三个操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
状态定义:
dp[i][j]
表示word1
的前i
个字母转换成word2
的前j
个字母所使用的最少操作。状态转移:
i
指向word1
,j
指向word2
若当前字母相同,则
dp[i][j] = dp[i-1][j-1]
否则取增删替三个操作的最小值加一,即:
dp[i][j] = min(Math.min(dp[i - 1][j],dp[i][j - 1],dp[i - 1][j - 1])
class Solution{
public int minDistance(String word1,String word2){
int len1 = word1.length();int len2 = word2.length();int[][] dp = new int[len1 + 1][len2 + 1];for(int i = 0;i <= len1;i++){
dp[i][0] = i;}for(int j = 0;j <= len2;j++){
dp[0][j] = j;}for(int i = 1;i <= len1;i++){
for(int j = 1;j <= len2;j++){
if(word1.charAt(i - 1) == word2.charAt(j - 1)){
dp[i][j] = dp[i - 1][j - 1];}else{
dp[i][j] = 1 + Math.min(Math.min(dp[i - 1][j],dp[i][j - 1],dp[i - 1][j - 1]));}}}return dp[len1][len2];}
}