看题解后才搞出来的;
我们先定义dp方程 :dp[i][j]代表word1的前i位和word2的前i位匹配所需要的最小步骤;
然后列出状态转移方程:
假设现在word1的前i位和word2的前i位经过dp[i][j]步运算后完全匹配,那么当i+1或者j+1,对应的dp[i+1][j]或者dp[i][j+1] = dp[i][j] + 1;当i+1并且j+1时,匹配word1的i+1位和word2的j+1位,相等的话直接转移,不想等+1
最后对边界预处理。
// 冲刺062
class Solution {
public int minDistance(String word1, String word2) {
int len1 = word1.length();
int len2 = word2.length();
if (len1 == 0) {
return len2;
}
if (len2 == 0) {
return len1;
}
int[][] dp = new int[len1][len2];
int flag = 0;
// 边界预处理
for (int i = 0; i < len2; i++) {
if (flag == 0 && word1.charAt(0) == word2.charAt(i)) {
flag = 1;
}
dp[0][i] = i + 1 - flag;
}
flag = 0;
for (int i = 0; i < len1; i++) {
if (flag == 0 && word2.charAt(0) == word1.charAt(i)) {
flag = 1;
}
dp[i][0] = i + 1 - flag;
}
for (int i = 1; i < len1; i++) {
for (int j = 1; j < len2; j++) {
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + 1;
dp[i][j] = Math.min(dp[i][j], word1.charAt(i) == word2.charAt(j) ? dp[i - 1][j - 1] : dp[i - 1][j - 1] + 1);
}
}
return dp[len1 - 1][len2 - 1];
}
}