编辑距离---动态规划(最小距离)

编辑距离---动态规划(最小距离)

这里运用了最小距离的算法 经典的动态规划
相同字符 左上角值加1 不相同字符 邻居三个取最小
注意点也要把"" 空字符串考虑进去
三个求最小可以改下为 Math.min(n, Math.min(m,l))

class Solution {
    public int min(int n , int m ,int l) {
        int temp = 0;
        if(m<=n&&m<=l)
            temp = m;
        else if(n<=m&&n<=l)
            temp = n;
        else if(l<=n&&l<=m)
            temp = l;
        return temp;
    }
    public int minDistance(String word1, String word2) {
        int n = word1.length();
        int m = word2.length();
        int arr[][] = new int [n+1][m+1];
         //word1 变成 空所需要的删除的步骤
        for (int i = 1; i <= n; i++) {
           arr[i][0] = i;
        }
        //空 变成 word2所需要的添加的步骤
        for (int j = 1; j <= m; j++) {
           arr[0][j] = j;
        }
        for(int i = 1 ; i <= n ; i ++) {
            for(int j = 1 ; j <= m ; j++) {
                if(word2.charAt(j-1)==word1.charAt(i-1)) {
                    arr[i][j] = arr[i-1][j-1];
                }
                else {
                    arr[i][j] = 1+ min(arr[i-1][j],arr[i][j-1],arr[i-1][j-1]);
                }
            }
        }
        return arr[n][m];
    }
}

更快一点的做法

class Solution {
    public int minDistance(String word1, String word2) {
        int m = word1.length(),n = word2.length();
        if(m==0||n==0) return m==0?n:m;
        int[][] dp = new int[m+1][n+1];
        //dp[i+1][j+1]表示word1的前i个字符和word2的前j个字符的编辑距离
        for(int i = 0; i <= m; i++)dp[i][0] = i;
        for(int i = 0; i <= n; i++)dp[0][i] = i;
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                int tmp = word1.charAt(i) == word2.charAt(j) ? 0 : 1;
                dp[i+1][j+1] = Math.min(Math.min(dp[i+1][j], dp[i][j+1])+1,dp[i][j]+tmp);
            }
        }
        return dp[m][n];
    }
}

猜你喜欢

转载自blog.51cto.com/14429166/2417057