Leecode72編集距離

タイトルの説明

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];
    }
}
元の記事を72件公開 称賛された0 訪問数723

おすすめ

転載: blog.csdn.net/weixin_40300702/article/details/105443362