오른쪽 하단 모서리의 값이 최종 필수 값입니다.
동적 프로그래밍 의 개념
정의 dp [i] [j]
21. dp [i] [j]는 word1의 처음 i 개 문자를 나타내며 word2에서 처음 j 개 문자로 변환되어
필요한 작업의 최단 수 22. word1 또는 word2가 수행하는지 고려할 필요가 있습니다. 문자가 없습니다. 즉, 모든 추가 / 삭제 상황이므로 dp [0] [j] 및 dp [i] [0]을 예약하십시오.
상태 전이
31. 증가, dp [i] [j] = dp [i] [j-1] + 1
32. 삭제, dp [i] [j] = dp [i-1] [j] + 1
33. 변경, dp [i] [j] = dp [i-1] [j-1] + 1
34. dp [i] [j], dp [i-1] [j], dp 계산시 순서대로 계산 [i] [j-1], dp [i-1] [j-1]이 결정되었습니다.
35.이 세 가지 작업의 추가, 삭제 및 수정으로 인해 작업 수를 1 씩 늘리려면 해당 dp가 필요합니다. 그리고 세 최소 소요
두 문자가 같은 word1로 될 일 경우 36 [I-1] = word2 후 직접 참조 할 수있다 [-1 j]가 DP와 [I-1] [J-1] 작업에 추가하지 않고
저자 : ikaruga
링크 : https : //leetcode-cn.com/problems/edit-distance/solution/edit-distance-by-ikaruga/
출처 : 스테이 버튼 (LeetCode)
저작권은 저자에게 있습니다. 상업적 재판의 경우 저자에게 연락하여 승인을 받고 비상업적 재판의 경우 출처를 표시하십시오.
하향식 :
public static int minDistance(String word1,String word2){
int n1 = word1.length();
int n2 = word2.length();
int[][] dp = new int[n1+1][n2+1];
//初始化 如果i或j两者中其中一个为零,则对word1一直执行删除操作或一直执行插入操作,且此时不能使用该关系式
for (int j = 1;j <= n2;j++){
dp[0][j] = dp[0][j-1]+1;
}
for (int i = 1;i <= n1;i++){
dp[i][0] = dp[i-1][0]+1;
}
//将从0-i的字符转换成0-j的字符
for (int i = 1;i <= n1;i++){
for (int j = 1;j <= n2;j++){
//如果word1[i]和word2[j]相等,第i个字符对应下标是i-1;
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-1][j-1],dp[i][j-1]),dp[i-1][j])+1;
}
}
}
return dp[n1][n2];
}