代码随想录刷题记录 day48 两个字符串的删除操作+编辑距离

代码随想录刷题记录 day48 两个字符串的删除操作+编辑距离

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

代码随想录刷题记录 day48 两个字符串的删除操作+编辑距离_第1张图片

思想

两个元素都能删除了,还是考虑第i-1个字符和第j-1个字符是不是相同的,不相同的话考虑三种情况,删除i-1;删除j-1,同时删除

1.dp数组的定义
dp[i][j]表示以i-1为结尾的字符串word1,和以j-1结尾的字符串word2 相同 最小需要dp[i][i]步


2.递推公式
word1[i-1]==word2[j-1] 第i-1个字符和j-1个字符相等
2.1 可以匹配 i-2 和j-2的位置是否是相同的 dp[i][j]=dp[i-1][j-1]

2.2 word1[i-1]!=word2[j-1]
2.2.1 删除 word1[i-1] 匹配word1[i-2] 和 word2[j-1] dp[i][j]=dp[i-1][j]+1;
2.2.2 删除 word2[j-1] 匹配word1[i-1] 和 word2[j-2] dp[i][j]=dp[i][j-1]+1;
2.2.3 删除 word1[i-1]和word2[j-1] 匹配word1[i-2] 和 word2[j-2]  dp[i][j]=dp[i-1][j-1]+2
这三个当中取最小的

3.初始化
由递推公式可得 dp[i][j]是由 左边和上边 和斜上而来得  需要初始化dp[i][0]和dp[0][j]
dp[i][0]表示以i-1结尾得字符串 和空字符串相同  需要i步 那么同理dp[0][j]=j

4.遍历顺序 
从上到下 从前到后

5.数组打印

代码

class Solution {
    public int minDistance(String word1, String word2) {
        //每次只能删除操作

        //1.dp数组的定义
        //dp[i][j]表示以i-1为结尾的字符串word1,和以j-1结尾的字符串word2 相同 最小需要dp[i][i]步


        //2.递推公式
        //word1[i-1]==word2[j-1] 第i-1个字符和j-1个字符相等
        //2.1 可以匹配 i-2 和j-2的位置是否是相同的 dp[i][j]=dp[i-1][j-1]

        //2.2 word1[i-1]!=word2[j-1]
        //2.2.1 删除 word1[i-1] 匹配word1[i-2] 和 word2[j-1] dp[i][j]=dp[i-1][j]+1;
        //2.2.2 删除 word2[j-1] 匹配word1[i-1] 和 word2[j-2] dp[i][j]=dp[i][j-1]+1;
        //2.2.3 删除 word1[i-1]和word2[j-1] 匹配word1[i-2] 和 word2[j-2]  dp[i][j]=dp[i-1][j-1]+2
        //这三个当中取最大的一个

        //3.初始化
        //由递推公式可得 dp[i][j]是由 左边和上边 和斜上而来得  需要初始化dp[i][0]和dp[0][j]
        //dp[i][0]表示以i-1结尾得字符串 和空字符串相同  需要i步 那么同理dp[0][j]=j
        int[][] dp=new int[word1.length()+1][word2.length()+1];
        for(int i=0;i<word1.length()+1;i++){
            dp[i][0]=i;
        }
        for(int j=0;j<word2.length()+1;j++){
            dp[0][j]=j;
        }
        //4.遍历顺序 从上到下 从左到右
        for(int i=1;i<word1.length()+1;i++){
            for(int j=1;j<word2.length()+1;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][j-1]+1,dp[i-1][j-1]+2));
                }
            }
        }

        return dp[word1.length()][word2.length()];

    }
}

72. 编辑距离

代码随想录刷题记录 day48 两个字符串的删除操作+编辑距离_第2张图片

思想

和前面几题的区别就是这道题目 其中一个字符串可以 插入删除 替换了

插入和删除的操作可以看成一个操作 即word1增加一个元素 等于word2删除一个元素

替换字符串 就匹配i-2 和j-2

1.dp数组得定义
dp[i][j]表示以i-1为结尾得字符串word1转换成以j-1结尾的字符串word2的最少的操作次数

2.递推公式
2.1 word1[i-1]==word2[j-1] dp[i][j]=dp[i-1][j-1] 即对这一个字符串不需要进行任何的操作
2.2 word1[i-1]!=word2[j-1] 
2.2.1 删除元素
 删除word1[i-1] dp[i][j]=dp[i-1][j]+1;
 删除word2[j-1] dp[i][j]=dp[i][j-1]+1;

2.2.2添加元素
word1添加元素等于word2删除一个元素 是一样的 所以可以省略

2.2.3替换元素 去匹配i-2和j-2就好了
dp[i][j]=dp[i-1][j-1]+1;

3.初始化 dp[i][0] dp[0][j]

4.遍历顺序 从上到下 从左至右

5.dp数组的打印

代码

class Solution {
    public int minDistance(String word1, String word2) {
        //1.dp数组得定义
        //dp[i][j]表示以i-1为结尾得字符串word1转换成以j-1结尾的字符串word2的最少的操作次数

        //2.递推公式
        //2.1 word1[i-1]==word2[j-1] dp[i][j]=dp[i-1][j-1] 即对这一个字符串不需要进行任何的操作
        //2.2 word1[i-1]!=word2[j-1] 
        //2.2.1 删除元素
        // 删除word1[i-1] dp[i][j]=dp[i-1][j]+1;
        // 删除word2[j-1] dp[i][j]=dp[i][j-1]+1;

        //2.2.2添加元素
        //word1添加元素等于word2删除一个元素 是一样的 所以可以省略

        //2.2.3替换元素 去匹配i-2和j-2就好了
        //dp[i][j]=dp[i-1][j-1]+1;

        //3.初始化 dp[i][0] dp[0][j]
        int[][] dp=new int[word1.length()+1][word2.length()+1];

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

        //4.遍历顺序 从上到下 从左至右
        for(int i=1;i<word1.length()+1;i++){
            for(int j=1;j<word2.length()+1;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][j-1]+1,dp[i-1][j-1]+1));
                }
            }
        }

        return dp[word1.length()][word2.length()];

    }
}

编辑距离总结

此类的题目基本上都是 一个字符串str1变成另外一个字符串str2所需要的最小的步数

衍生出不同的限制,比如:

1.判断子序列 str1 能够变为str2

2.不同的子序列 str1有多少种变为str2的方法,str2可以删除

3.两个字符串的删除操作 str1变成str2 最少的步数 str1和str2都可以删除

4.编辑距离,str1变成str2,str1可以删除、添加、替换元素

参考:代码随想录

你可能感兴趣的:(动态规划,算法)