Edit Distance(LeetCode)

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

a) Insert a character
b) Delete a character
c) Replace a character

動態規劃問題:(用遞歸思想轉換)
dp[i][j] i代表word1的下標,j代表Word2的下標

那麼將word1轉爲Word2就有4種操作:
1.插入
2.刪除
3.替換
4.如果word1[i]==word2[j]當前相等,什麼都不做,直接比較後面的

一. 在word1[i]==word2[j]的情況下
1.可以直接過,比較下一個字符
int d1 = dp[i+1][j+1];
2.可以在i位置前插入一個字符,讓他們相等,插入一個字符後,比較後面的字符那麼i位置不變,j往後移1位
int d2 = dp[i][j+1]+1;
3.可以刪除i位置的字符,讓他們比較後面的字符,刪除一個字符後,要比較後面的字符,i位置往後移一位,j位置不變
int d3 = dp[i+1][j]+1;
4.既然相等就沒必要替換,替換隻會增加操作
那麼:dp[i][j]=min(d1,d2,d3);

二.在word1[i]!=word2[j]的情況下
1.可以插入一個字符讓他們相等,插入一個字符後,比較後面的字符那麼i位置不變,j往後移1位
int d2 = dp[i][j+1]+1;
2.可以刪除i位置的字符,讓他們比較後面的字符,刪除一個字符後,要比較後面的字符,i位置往後移一位,j位置不變
int d3 = dp[i+1][j]+1;
3.可以替換當前字符,讓他們相等,替換後比較後面的字符,i位置後移1位,j位置後移1位
int d4 = dp[i+1][j+1]+1;

那麼:dp[i][j]=min(d2,d3,d4);

邊界控制:

        int k=1;
        for(int i=len1-1;i>=0;--i)
            dp[i][len2]=k++;
        k=1;
        for(int i=len2-1;i>=0;--i)
            dp[len1][i]=k++;

ac代碼:

public static int minDistance(String word1, String word2) {
        int len1 = word1.length();
        int len2 = word2.length();
        int dp[][] = new int[len1+1][len2+1];

        int k=1;
        for(int i=len1-1;i>=0;--i)
            dp[i][len2]=k++;
        k=1;
        for(int i=len2-1;i>=0;--i)
            dp[len1][i]=k++;

        for(int i=len1-1;i>=0;--i){

            for(int j=len2-1;j>=0;--j){

                if(word1.charAt(i)==word2.charAt(j)){

                    int a=Math.min(dp[i][j+1]+1, dp[i+1][j+1]+1);
                    int b = Math.min(a, dp[i+1][j+1]);

                    dp[i][j] = b;

                }else{

                    int a=Math.min(dp[i][j+1]+1, dp[i+1][j+1]+1);
                    int b = Math.min(a, dp[i+1][j+1]+1);

                    dp[i][j] = b;

                }



            }


        }


        return dp[0][0];

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章