72. 编辑距离—最少操作次数
题目描述
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
实现代码
class Solution {
public static int minDistance(String word1,String word2){
int m=word1.length();
int n=word2.length();
int[][] dp=new int[m+1][n+1];
//确定baseCase的情况
for(int i=1;i<=m;i++){
dp[i][0]=i;
}
for(int j=1;j<=n;j++){
dp[0][j]=j;
}
for (int i = 1; i <=m; i++) {
for (int j = 1; j <=n; j++) {
if (word1.charAt(i-1)==word2.charAt(j-1)) {
dp[i][j]=dp[i-1][j-1];
}
else {
dp[i][j] = Math.min(Math.min(dp[i][j - 1]+1,dp[i - 1][j]+1),dp[i - 1][j - 1]+1);
}
}
}
return dp[m][n];
}
}
编辑距离—编辑距离最少代价
题目描述
给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,请输出将str1编辑成str2的最小代价。
实现代码
import java.util.*;
public class Solution {
/**
* min edit cost
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @param ic int整型 insert cost
* @param dc int整型 delete cost
* @param rc int整型 replace cost
* @return int整型
*/
public int minEditCost (String word1, String word2, int ic, int dc, int rc) {
// write code here
int m = word1.length();
int n = word2.length();
int[][] dp = new int[m + 1][n + 1];
//确定baseCase的情况
for (int i = 1; i <= m; i++) {
dp[i][0] = i*dc;
}
for (int j = 1; j <= n; j++) {
dp[0][j] = j*ic;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = Math.min(Math.min(dp[i][j - 1] + ic, dp[i - 1][j] + dc),
dp[i - 1][j - 1] + rc);
}
}
}
return dp[m][n];
}
}