
/**
minOps[i][j]:代表S1与S2分别以i、j结尾(长度),将S1替换为S2需要的最少操作步骤
若S1[i] == S2[j],则minOps[i][j] = minOps[i - 1][j - 1],
即当前两字符相等,无需进行操作,minOps[i][j]取决于之前的状态,将S1、S2各自向前推一个字符即可
若S1[i] != S2[j],说明当前两字符不相等,我们有插入、删除、替换三种操作方式
插入:
若在S1末尾(当前处理到的末尾)插入S2[j]:则此时S1、S2末尾元素i相同,退化至相等的情况,再各自向前推一个元素即可,由于S1末尾插入元素,向前推还是i
则minOps[i][j] = 1 + minOps[i][j - 1] 即插入操作 + 各自向前推一个字符对应的状态
删除:
若删除S1末尾(当前处理到的末尾)元素,则S2无需进行处理,直接将S1向前推一个元素即可(并非真正删除,用向前推一个元素代表删除,避免影响其他情况)
则minOps[i][j] = 1 + minOps[i - 1][j] 即删除操作 + S1向前推一个字符对应的状态
替换:
若将S1末尾元素(当前处理到的末尾),替换为S2[j],则退化至相等情况,再各自向前推一个元素即可
则minOps[i][j] = 1 + minOps[i - 1][j - 1] 即替换操作 + S1、S2各自向前推一个字符对应的状态
选择这三种状态中所需操作次数最小的一个即可
*/
class Solution {
/**
minOps[i][j]:代表S1与S2分别以i、j结尾(长度),将S1替换为S2需要的最少操作步骤
若S1[i] == S2[j],则minOps[i][j] = minOps[i - 1][j - 1],
即当前两字符相等,无需进行操作,minOps[i][j]取决于之前的状态,将S1、S2各自向前推一个字符即可
若S1[i] != S2[j],说明当前两字符不相等,我们有插入、删除、替换三种操作方式
插入:
若在S1末尾(当前处理到的末尾)插入S2[j]:则此时S1、S2末尾元素i相同,退化至相等的情况,再各自向前推一个元素即可,由于S1末尾插入元素,向前推还是i
则minOps[i][j] = 1 + minOps[i][j - 1] 即插入操作 + 各自向前推一个字符对应的状态
删除:
若删除S1末尾(当前处理到的末尾)元素,则S2无需进行处理,直接将S1向前推一个元素即可(并非真正删除,用向前推一个元素代表删除,避免影响其他情况)
则minOps[i][j] = 1 + minOps[i - 1][j] 即删除操作 + S1向前推一个字符对应的状态
替换:
若将S1末尾元素(当前处理到的末尾),替换为S2[j],则退化至相等情况,再各自向前推一个元素即可
则minOps[i][j] = 1 + minOps[i - 1][j - 1] 即替换操作 + S1、S2各自向前推一个字符对应的状态
选择这三种状态中所需操作次数最小的一个即可
*/
public int minDistance(String word1, String word2) {
int len1 = word1.length();
int len2 = word2.length();
int dp[][] = new int[len1 + 1][len2 + 1];
//初始化word1或word2为空
for(int i = 1; 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] = Math.min(Math.min(dp[i][j - 1], dp[i- 1][j]),dp[i - 1][j - 1]) + 1;
}
}
}
return dp[len1][len2];
}
}
420



被折叠的 条评论
为什么被折叠?



