72. 编辑距离

2023-08-20  本文已影响0人  红树_

题目

参考72. 编辑距离

解题思路

动态规划 4ms

class Solution {
    public int minDistance(String word1, String word2) {
        int m = word1.length(), n = word2.length();
        char[] w1 = word1.toCharArray(), w2 = word2.toCharArray();
        //考虑动态规划 dp[i][j]表示word1[0-i]转化为word2[0-j]所使用的最少操作次数
        int[][] dp = new int[m+1][n+1];
        dp[0][0] = 0;
        for(int i = 0; i <= m; i++) dp[i][0] = i;
        for(int j = 0; j <= n; j++) dp[0][j] = j;
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <= n; j++) {
                if(w1[i-1]==w2[j-1]) dp[i][j] = dp[i-1][j-1];
                else {
                    dp[i][j] = Math.min(dp[i-1][j]+1,dp[i][j-1]+1);
                    dp[i][j] = Math.min(dp[i][j],dp[i-1][j-1] + 1);
                }
            }
        }
        return dp[m][n];
    }
}

记忆化搜索 2ms

class Solution {
    char[] w1,w2;
    int[][] memo;
    public int minDistance(String word1, String word2) {
        int m = word1.length(), n = word2.length();
        w1 = word1.toCharArray();
        w2 = word2.toCharArray();
        memo = new int[m+1][n+1];//记忆化搜索优化
        return dfs(m,n);
    }

    int dfs(int i,int j) {
        if(i == 0) return j;
        if(j == 0) return i;
        if(memo[i][j] != 0) return memo[i][j];
        if(w1[i-1] == w2[j-1]) return memo[i][j] = dfs(i-1,j-1);
        int res = Math.min(dfs(i-1,j),dfs(i,j-1));
        return memo[i][j] = Math.min(res,dfs(i-1,j-1)) + 1;
    }
}

复杂度分析

上一篇 下一篇

猜你喜欢

热点阅读