Leetcode 72) Edit Distance

image

내 답안

  • DP를 붙잡고 씨름한지 몇주째… 드디어 감이 좀 온거같다..! 생각하지 말고 공식에 따르면 풀림… 내머리로 알고리즘을 짜내서 풀 수 있는 그런게 아녔당…
class Solution {
    int[][] dp;
    public int minDistance(String word1, String word2){
        //가장 긴 subsequence를 찾는 문제랑 비슷해지지 않을까?
        dp = new int[word1.length()+1][word2.length()+1];
        for(int[] ddp : dp){
            Arrays.fill(ddp,-1);
        }
        return lcs(word1,word2);        
    }
    public int lcs(String w1, String w2){
        int l1 = w1.length();
        int l2 = w2.length();
        if(l1==0 && l2==0){
            return 0;
        }else if(l2==0){
            return l1;
        }else if(l1==0){
            return l2;
        }

        if(dp[w1.length()][w2.length()]!=-1){
            return dp[w1.length()][w2.length()];
        }


        if(w1.charAt(l1-1) == w2.charAt(l2-1)){
            return lcs(w1.substring(0,l1-1),w2.substring(0,l2-1));
        }else{
            //add, replace, delete중에 고르기
            //replace, delete,add
            int res= 1+Math.min(Math.min(lcs(w1.substring(0,l1-1),w2.substring(0,l2-1)),lcs(w1.substring(0,l1-1),w2)),1+lcs(w1,w2.substring(0,l2-1)));
            return res;
        }

    }
}

다른 답안

class Solution {
    public int minDistance(String word1, String word2) {
        int len1 = word1.length(), len2 = word2.length();

        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 = 1; i <= len1; i++) {
            for (int j = 1; j <= len2; j++) {
                if (word1.charAt(i-1) == word2.charAt(j-1)) {
                    dp[i][j] = dp[i-1][j-1];
                } else {
                    dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + 1;
                }
            }
        }

        return dp[len1][len2];
    }
}

© 2018. All rights reserved.

Powered by Hydejack v8.5.2