72個の質問LeetCode:編集距離(難しいです)
-
タイトル:、WORD1が使用WORD2変換操作の最小数を計算するためにWORD1とWORD2二つの単語が与えられます。あなたは一つの単語の上に、以下の3つの操作を行うことができます。文字を挿入、文字を削除し、文字を置き換えます
-
Aは考えた:①動作させるために、比較ビットを考え始めます。しかし、アイデアは例が不合理挙げることができる非常に簡単です。②その後、各文字の場所について検索し、落ち着くために、他の場所は行動の必要性がなく、適切な場所を選択します。しかし、いくつかの文字が存在することも、挿入する必要はありません。Soが 。。私は、私はないと思います。。。。
-
アイデアII:解釈は、[J] [i]のDPを有する、動的プログラミングの概念に与えられているj個のビットが必要とする前に、私はステップのWORD1 WORD2番号なる前にビットを表します。最後のものは、同じである、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];
}
}