代码随想录

583. 两个字符串的删除操作

思路

思路:跟最长公共子序列的意思是一样的,删除的步数=两个字符串总长度-2*最长的子序列长度
dp[i][j]表示字符串A从0-i-1和字符串B从0-j-1的最长公共子序列的长度
dp[0][0]=0

递推:
if(c1[i-1] == c2[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1])

代码

class Solution {
    public int minDistance(String word1, String word2) {
        int dp[][] = new int[word1.length()+1][word2.length()+1];

        for(int i = 1;i<=word1.length();i++){
            for(int j = 1;j<=word2.length();j++){
                if(word1.charAt(i-1) == word2.charAt(j-1)) dp[i][j]=dp[i-1][j-1]+1;
                else dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);

            }
        }
        return word1.length()+word2.length()-2*dp[word1.length()][word2.length()];
    }
}

72. 编辑距离

思路

题解思路:
动态规划:定义dp[i][j]表示word1的0-i-1子串,以及word2的0-j-1子串最近编辑距离为递推公式:
if(word1[i-1] == word2[j-1])
无操作 dp[i][j] = dp[i-1][j-1]
else
增 和删除效果一样
删 dp[i-1][j]+1,dp[i][j-1]+1
换 dp[i-1][j-1]+1
这三种取最小

初始化:
dp[i][0]=i
dp[0][j]=j

代码

class Solution {
    public int minDistance(String word1, String word2) {

        int dp[][] = new int[word1.length()+1][word2.length()+1];

        for(int i = 0;i<=word1.length();i++){
            dp[i][0]=i;
        }
        for(int j = 0;j<=word2.length();j++){
            dp[0][j]=j;
        }

        for(int i = 1;i<=word1.length();i++){
            for(int j = 1;j<=word2.length();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[word1.length()][word2.length()];

    }
}

07-19 05:34