lc583

有两种解法,一种是求两个单词的最长公共子列,最后结果为m*n-dp[m][n]

其中dp[m][n]表示两个单词的最长公共子列长度

另一种解法是直接算:

class Solution {
    public int minDistance(String word1, String word2) {
        int m=word1.length(),n=word2.length();
        int[][] dp=new int[m+1][n+1];
        for(int i=0;i<=m;i++){
            for(int j=0;j<=n;j++){
                if(i==0||j==0) dp[i][j]=i+j;
                else if(word1.charAt(i-1)==word2.charAt(j-1)){
                    dp[i][j]=dp[i-1][j-1];
                }else{
                    dp[i][j]=1+Math.min(dp[i-1][j],dp[i][j-1]);
                }

            }
        }
        return dp[m][n];
       
    }
}

如果第i和第j位相同,那么dp[i][j]=dp[i-1][j-1],即两个单词最后一位不用删

如果不相同,说明这两位在最终结果中肯定有一位是要被删掉的,只需考虑s1[1:i-1]和s2[1:j]以及s1[1:i]和s2[1:j-1]之间至少要删掉多少个字符,然后把结果加上1就行。、

posted @ 2020-10-28 16:20  fjlruo  阅读(57)  评论(0编辑  收藏  举报