タイトルの説明
2つの単語word1とword2が与えられた場合、word1をword2に変換するために必要なステップ数を計算します。
単語に対して次の3つの操作を実行できます。a)
単語に文字を挿入
b)単語にある文字を削除
c)単語にある文字を置き換える
分析
- 動的プログラミングアルゴリズムを使用します。
- ステータス表示:dp [i] [j]:word1の最初のi文字部分文字列がword2の最初のj文字部分文字列になるために必要なステップ数
- 初期化:一方のパーティーは空になり、他方のパーティーになります。もう一方のパーティーのすべての文字を挿入するだけでよく、操作の数は他方のパーティーの長さと同じです。
- 状態の再帰:
* word1 [i] == word2 [j]の場合:dp [i] [j] = min {1、dp [i-1] [j] +1,2、dp [i] [j- 1] +1,3、dp [i-1] [j-1]}、1:は、word1の1つ少ない文字がword2になると、その文字が削除されるため、ステップ数が1増えることを意味します。2:word1が1文字少ないword2になる場合、欠けている文字を増やすために1ステップを追加する必要があることを示します。3:word1の1文字がword2の1文字よりも小さい場合、ステップ数は等しいことを示します。
* word1 [i]の場合!= word2 [j]:dp [i] [j] =最小{1、dp [i-1] [j] +1,2、dp [i] [j-1] +1,3、dp [i- 1] [j-1]}、1:は、word1が1文字少なく、word2になる場合、その文字が削除されるため、ステップ数が1増えることを意味します。2:word1が1文字少ないword2になる場合、欠けている文字を増やすために1ステップを追加する必要があることを示します。3:これは、word1の1文字がword2の1文字よりも小さい場合、最後の文字を置き換える必要があり、ステップ数が1増えることを意味します。
Javaコード
public class Solution {
public int minDistance(String word1, String word2) {
if(word1==null ||word2 == null ){
return 0;
}
if(word1.length() == 0){
return word2.length();
}
if(word2.length() == 0){
return word1.length();
}
int m = word1.length();
int n = word2.length();
//word1 前i个字符子串 变成word2 前j个字符子串需要的步数。
//0 1 2 3 **** m 多一个
int dp [][] = new int [m+1][n+1];
//初始化
for(int i = 0; i <= m; i++){
//不同的word1 变成word2(空) 需要的步数 删去长度个字符
dp[i][0] = i;
}
for(int i = 0; i <= n; i++){
//word1 为空 变成word2(不同的) 需要添加长度个字符
dp[0][i] = i;
}
for(int i = 1;i <= m;i++){
for(int j = 1;j <= n;j++){
//先给最大值 以防出问题
//word1 前i个字符 word2 前j个字符
dp[i][j] = Integer.MAX_VALUE;
//第i个字符时i-1下标
if(word1.charAt(i-1) == word2.charAt(j-1)){
dp[i][j] = Math.min(dp[i][j],dp[i-1][j]+1);
dp[i][j] = Math.min(dp[i][j],dp[i][j-1]+1);
dp[i][j] = Math.min(dp[i][j],dp[i-1][j-1]);
}else{
dp[i][j] = Math.min(dp[i][j],dp[i-1][j]+1);
dp[i][j] = Math.min(dp[i][j],dp[i][j-1]+1);
dp[i][j] = Math.min(dp[i][j],dp[i-1][j-1]+1);
}
}
}
return dp[m][n];
}
}