72 개 질문 LeetCode : 편집 거리 (어려운)
-
제목 : word1을 사용 word2 변환 작업의 최소 수를 계산하는 단어 1과 word2 두 단어 감안할. 당신은 하나 개의 단어에 다음과 같은 세 가지 작업을 수행 할 수 있습니다 : 문자를 삽입, 문자를 삭제, 문자를 대체
-
생각은 : 작동, 조금 비교 생각을 시작 ①. 하지만 아이디어는 매우 간단한 예제가 부당들 수있다. ② 다음 나중에 각 문자의 위치에 대해 검색하고 정착 할 다른 장소 조치의 필요가없는 적절한 위치를 선택합니다. 그러나, 몇 가지 문자가 존재할 수 삽입 할 필요가 없을 수 있습니다. 겠어요 - . . 내가하지 않습니다 생각합니다. . . .
-
아이디어 II : 해석이 제가 필요한 J 비트 전에 단계 word2 word1을 참조되기 전에 DP로 [I]는 [j]가 비트를 나타내고, 동적 프로그래밍의 개념에 주어진다. 마지막으로 한 동일 DP이면 [I] [J] = DP [I-1] [J-1] 마지막으로 한 동일 DP 않을 때 [I] [J] = 분 (DP [I-1] J-1] (DP) [I-1] [J], DP [I] [J-1]) + 1이다. DP는 [I-1] [J-1] 교체 작업, DP를 나타내고, [I-1] [J]를 삭제 DP [I] [J-1]를 나타내는 삽입 동작을 나타낸다. 또한, 단어의 경우가 비어 고려한다.
class Solution {
public int minDistance(String word1, String word2) {
int n1 = word1.length();
int n2 = word2.length();
int[][] dp = new int[n1 + 1][n2 + 1];
// 第一行
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;
for (int i = 1; i <= n1; i++) {
for (int j = 1; j <= n2; 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 - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
}
}
return dp[n1][n2];
}
}