day56|583. 两个字符串的删除操作、72. 编辑距离

文章目录

  • 一、583. 两个字符串的删除操作
  • 二、72. 编辑距离

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

注意的点:

  1. 若比较的字符相等,则就是左上角的dp值
  2. 若比较的字符不相等,则取(左侧值+1、上侧值+1、左上角值+2)的最小值。

以下是代码部分:

public class 两个字符串的删除操作583 {

    public int minDistance(String word1, String word2) {

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

        //初始化,与空字符串相同,就需要剪掉i、j个字符
        for (int i = 0; i < dp.length; i++) {
            dp[i][0] = i;
        }
        for (int i = 0; i < dp[0].length; i++) {
            dp[0][i] = i;
        }

        //[1]也要初始化,因为涉及到 -2 的操作
        for (int i = 1; i < dp.length; i++) {
            if(word1.charAt(i-1) == word2.charAt(0))
                dp[i][1] = 0;
            else
                dp[i][1] = 1;
        }

        //遍历
        for (int i = 1; i < dp.length; i++) {
            for (int j = 1; j < dp[0].length; j++) {

                //如果相等,则不需要删除
                if(word1.charAt(i-1) == word2.charAt(j-1))
                    dp[i][j] = dp[i-1][j-1];

                /*
                //踩坑,这里是左方和上方,而不是 -1、-2

                //如果与前一个字符相等,
                else if(word1.charAt(i-1) == word2.charAt(j-2))
                    //dp[i][j] = dp[i-1][j-2] + 1;
                    dp[i][j] = dp[i][j-1] + 1;

                else if(word1.charAt(i-2) == word2.charAt(j-1))
                    //dp[i][j] = dp[i-2][j-1] + 1 ;
                    dp[i][j] = dp[i-1][j] + 1 ;

                else
                    dp[i][j] =dp[i-1][j-1] + 2;

                 */

                else
                    dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + 1;
            }
        }

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

二、72. 编辑距离

  1. 增:当前长度 word1 i, word2 j-1。此时,word2增加一个字符,则word1 若想变成word2,需要在word1后边添加一个相同的字符,即dp[i][j] = dp[i][j-1] + 1;
  2. 删:当前长度 word1 i-1, word2 j。此时,word1增加了一个字符,导致变得不同,若想变成word2,则要把这个新字符删除,即dp[i][j] = dp[i-1][j] + 1;
  3. 改:当前长度 word1 i-1, word2 j-1。此时,word1、word2都增加了一个字符,导致变得不同,若想变成word2,则要把word1最后增加的字符变成word2的那个字符,即dp[i][j] = dp[i-1][j-1] + 1;

以下是代码部分:

public class 编辑距离72 {

    public int minDistance(String word1, String word2) {

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

        //初始化
        //长为i的字符串 转化为 空字符串,需删除 i 个字符
        for (int i = 0; i < dp.length; i++) {
            dp[i][0] = i;
        }
        //空字符串 转化为 长度为i 的字符串,需添加 i 个字符
        for (int i = 1; i < dp[0].length; i++) {
            dp[0][i] = i;
        }

        //遍历
        for (int i = 1; i < dp.length; i++) {
            for (int j = 1; j < dp[0].length; j++) {

                //如果相等,则不需要额外的操作
                if(word1.charAt(i-1) == word2.charAt(j-1))
                    dp[i][j] = dp[i-1][j-1];

                //否则,选取增、删、改中总操作数最小的那一个操作
                //增:当前长度 word1 i, word2 j-1。此时,word2增加一个字符,则word1 若想变成word2,需要在word1后边添加一个相同的字符,即dp[i][j] = dp[i][j-1] + 1;
                //删:当前长度 word1 i-1, word2 j。此时,word1增加了一个字符,导致变得不同,若想变成word2,则要把这个新字符删除,即dp[i][j] = dp[i-1][j] + 1;
                //改:当前长度 word1 i-1, word2 j-1。此时,word1、word2都增加了一个字符,导致变得不同,若想变成word2,则要把word1最后增加的字符变成word2的那个字符,即dp[i][j] = dp[i-1][j-1] + 1;
                else
                    dp[i][j] = Math.min(dp[i][j-1],Math.min(dp[i-1][j], dp[i-1][j-1])) + 1;
            }
        }

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

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