第一天发博,打算用此博记录准备秋招的点点滴滴,萌新求关照。

今日共刷了五道力扣,62、63、72、198、213。

通过做这几道题,大概摸索到了动态规划的边缘。要先弄清dp数组所代表的含义,之后由暴力递归找到dp数组之间的关系。比如72题编辑距离。此题难度为困难,主要难在dp关系的建立。

给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符
删除一个字符
替换一个字符
示例 1:

输入: word1 = "horse", word2 = "ros"
输出: 3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/edit-distance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

dp[i][j]的含义为,使word1的前i为,与word2的前i位相等所需要的编辑次数;显而易见,当i=0时,若要让word的前0位与word2的前j位相等,所需最小编辑次数为j,均为增加。dangj=0时同理。故dp[][]最上方一行,最左列可以求出。

对于未知的dp[i][j],若wodr1.chartat(i-1)==word2.charat(j-1),则在此处不需要操作,dp[i][j]=dp[i-1][j-1]。

若wodr1.chartat(i-1)!=word2.charat(j-1),则分三种情况讨论;

  • 若需要进行删除操作,则在前i-1位时,与word2前j位相等,第i位多余,故dp[i][j]=dp[i-1][j]+1
  • 若需要增加操作,则此时word1前i位与word2前j-1位相等,dp[i][j] =dp[i][j-1]+1
  • 若需要替换操作,则此时word1前i-1位与word2前j-1位相等,dp[i][j] = dp[i-1][j-1]+1
附上代码:
 
class Solution {
    public int minDistance(String word1, String word2) {
        int m = word1.length();
        int n = word2.length();
        int[][] dp = new int[m+1][n+1];
        //初始化dp
        for (int i = 0; i <=m ; i++) {
            dp[i][0] = i;
        }
        for (int i = 0; i <=n ; i++) {
            dp[0][i] = i;
        }
        for (int i = 1; i <=m ; i++) {
            for (int j = 1; j <=n ; j++) {
                if(word1.charAt(i-1)==word2.charAt(j-1)){dp[i][j] = dp[i-1][j-1];}
                else{
                    //如果需要删除 dp[i][j] = dp[i-1][j]
                    //如果需要增加 dp[i][j] = dp[i][j-1]
                    //如果需要替换 dp[i][j] = dp[i-1][j-1]
                    dp[i][j] = Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
                }
            }

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

猜你喜欢

转载自www.cnblogs.com/zhangbochao/p/12358448.html
今日推荐