原题插入删除替换代价都是1
- 算法
- 1.动态规划:dp[i][j]表示word1的前i个字符编辑成word2的前j个字符需要的最小操作数
- 2.初始状态:dp[i][0] = i,i次删除;dp[0][i] = i,i次插入
- 3.过渡公式:
- 当i字符等于j字符时:dp[i][j] = dp[i-1][j-1],不需要额外操作
- 当i字符不等于j字符时:dp[i][j] = Math.min(insert, delete, replace)
- int insert = dp[i][j-1] + 1; i个编辑成j-1个字符,再插入一个j
- int delete = dp[i-1][j] + 1; i-1个编辑成j个字母,再删除一个i
- int replace = dp[i-1][j-1] + 1; i-1个编辑成j-1个字母,再将i替换成j
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
int[][] dp = new int[m+1][n+1];
for (int i = 1; i <= m; i++) {
dp[i][0] = i;
}
for (int i = 1; i <= n; i++) {
dp[0][i] = i;
}
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 {
int insert = dp[i][j-1] + 1;
int delete = dp[i-1][j] + 1;
int replace = dp[i-1][j-1] + 1;
dp[i][j] = Math.min(insert, Math.min(delete, replace));
}
}
}
return dp[m][n];
} - 算法
- 1.优化空间复杂度
- 2.用一个变量prev保存dp[i]更新前的值,然后用这个变量更新dp[i]
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
int[] dp = new int[n+1];
for (int i = 1; i <= n; i++) {
dp[i] = i;
}
for (int i = 1; i <= m; i++) {
int prev = dp[0];
dp[0] = i;
for (int j = 1; j <= n; j++) {
int temp = dp[j];
if (word1.charAt(i-1) == word2.charAt(j-1)) {
dp[j] = prev;
} else {
int insert = prev + 1;
int delete = dp[j] + 1;
int replace = dp[j-1] + 1;
dp[j] = Math.min(insert, Math.min(delete, replace));
}
prev = temp;
}
}
return dp[n];
} 此题插入删除替换代价给定
public int minEditCost (String str1, String str2, int ic, int dc, int rc) {
// write code here
int m = str1.length();
int n = str2.length();
int[][] dp = new int[m+1][n+1];
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++) {
char c1 = str1.charAt(i-1);
for(int j = 1; j <= n; j++) {
char c2 = str2.charAt(j-1);
if(c1 == c2) {
dp[i][j] = dp[i-1][j-1];
} else {
int insert = dp[i][j-1] + ic;
int delete = dp[i-1][j] + dc;
int replace = dp[i-1][j-1] + rc;
dp[i][j] = Math.min(replace, Math.min(insert, delete));
}
}
}
return dp[m][n];
} 
京公网安备 11010502036488号