
求最值,动态规划题。
用
dp[i][j]
表示从
word[0...i]
转换到
word[0...j]
的最小操作,使用动态规划求解
class Solution {
public int minDistance(String word1, String word2) {
int row = word1.length();
int col = word2.length();
//dp[i][j]表示word1[0...i]变为word2[0...j]所使用的最少操作数
int[][] dp = new int[row+1][col+1];
//初始化:当word1为空字符串“”时,row=0
for(int j = 0; j <= col; j++){
dp[0][j] = j; //操作为:插入字符
}
//初始化:当word2为空字符串“”时,col=0
for(int i = 0; i <= row; i++){
dp[i][0] = i; //操作为:删除字符
}
for(int i = 1; i <= row ; i++){
for(int j = 1; j <= col; j++){
//末尾字符相同,不需要编辑.(对应字符相等,不操作.)(注意下标,dp[][]下标为从1开始,字符串下标从0开始)
if(word1.charAt(i-1) == word2.charAt(j-1)){//所以要减去1
dp[i][j] = dp[i-1][j-1];
}else{
// 末尾字符不同,三种编辑情况,取最小值
//需要操作,对应操作分别为:替换,删除,插入
dp[i][j] = 1 + Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1]));
}
}
}
return dp[row][col];
}
}
题解ref:
https://leetcode-cn.com/problems/edit-distance/solution/zi-di-xiang-shang-he-zi-ding-xiang-xia-by-powcai-3/