LeetCode 80 Edit Distance

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
분석: 가장 최적화된 문제를 보면 먼저 게이지를 생각하고 서브문제와 상체 전이 방정식을 찾으면 이 문제는 게이지로 해결할 수 있다.
하위 문제:word1의 전 i 문자에서word2의 전 j 문자로 이동하는 데 필요한 최소 걸음수는 dp[i][j]로 표시하면 마지막 답은 dp[len1][len2]이다.
상태 전환 방정식:
세 가지 전이 방식이 있기 때문에, Replace, insert, delete,
만약 i, j 위치의 문자가 같으면 조작할 필요가 없습니다. dp[i+1][j+1] = dp[i][j];
같지 않으면 다음과 같은 세 가지 전환 방법이 있습니다.
replace = dp[i][j] + 1;
insert = dp[i][j+1] + 1;
delete = dp[i+1][j] + 1;
dp[i+1][j+1] = min{ replace, insert, delete }.
public class Solution {
    public int minDistance(String word1, String word2) {
        //    
        if(word1==null || word2==null)
            return -1;
        int len1 = word1.length();
        int len2 = word2.length();
        //       word1 i    word2 j           
        int[][] dp = new int[len1+1][len2+1];
        for(int i=0; i<=len1; i++)
            dp[i][0] = i;
        for(int j=0; j<=len2; j++)
            dp[0][j] = j;
        for(int i=0; i<len1; i++){
            char c1 = word1.charAt(i);
            for(int j=0; j<len2; j++){
                char c2 = word2.charAt(j);
                if(c1 == c2)
                    dp[i+1][j+1] = dp[i][j];
                else{
                    int replace = dp[i][j]+1;
                    int insert = dp[i][j+1]+1;
                    int delete = dp[i+1][j]+1;
                    //find the min one
                    int min = Math.min(replace, insert);
                    min = Math.min(min, delete);
                    dp[i+1][j+1] = min;
                }
            }
        }
        return dp[len1][len2];
    }
}

좋은 웹페이지 즐겨찾기