前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >动态规划问题-LeetCode 91、72(动态规划方程)

动态规划问题-LeetCode 91、72(动态规划方程)

作者头像
算法工程师之路
发布2019-10-14 15:30:04
5690
发布2019-10-14 15:30:04
举报
作者:TeddyZhang,公众号:算法工程师之路

回溯问题:LeetCode #91 #72

1

编程题

【LeetCode #91】解码方法

一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 … 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数。

示例 1:

输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。 示例 2: 输入: "226" 输出: 3 解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

解题思路:

假设dp[i]表示前i-1个数字所解码的字符串数量,因此对于i来说,且dp长度为s.length()+1,其有两种编码方式:

  • 由一个数字编码而来,即最后一个数字s[i-1]不为零即可,从而需要加上前i-2的解码数量,即dp[i] += dp[i-1]
  • 由两个数字编码而来, 即最后一个数字s[i-2]和s[i-1]构成的两位数字在1~26之间,从而要加上前i-3个数字的解码数量,即dp[i] +=dp[i-2]

我们只需要判断这两个条件,如果成立了,就加上相应的结果即可!

class Solution {
public:
    int numDecodings(string s) {
        if (s[] == '0') return ;
        vector<int> dp(s.length() + );
        dp[] = dp[] = ;
        for(int i = ; i <= s.length(); i++){
            if(s[i-1] != '0'){
                dp[i] += dp[i-1];
            }
            if((s[i-2] == '1') || (s[i-2] == '2' && s[i-1] <= '6')){
                dp[i] += dp[i-2];
            }
        }
        return dp[s.length()];
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/decode-ways

【LeetCode #72】编辑距离

给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1:

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

解题思路:

利用动态规划的思想,我们可以得到以下几个递推式: 在DP矩阵初始化时,dp[i][j]表示source[0:i]编辑成result[0:j]所需要的最小编辑距离,因此当i=0或者j=0,则需要最小编辑距离为非零长度字符串的长度(依次插入或删除)。

  1. 如果source[i]和result[j]字母相同,则cost[i][j] = cost[i-1][j-1],相同字符不进行处理,不需要操作数。
  2. 将对word1处理转换为word1和word2的处理:
  • word1 插入一个字符 dp[i-1][j] + 1 -> dp[i][j]
  • word1 删除一个字符 = word2 插入一个字符 dp[i][j-1] + 1 -> dp[i][j]
  • word1 替换一个字符 = word1 word2 都替换一个字符 dp[i-1][j-1] + 1 -> dp[i][j]

综上所述,其状态方程可以总结为两个: 当word1[i] == word2[j],则dp[i][j] = dp[i-1][j-1], 即没有操作 当word1[i] != word2[j],则dp[i][j] = 1 + min(cost[i-1][j-1], min(cost[i][j-1], cost[i-1][j])),每步最小的操作数+1。

class Solution {
public:
    int minDistance(string word1, string word2) {
        int m = word1.length();
        int n = word2.length();

        vector<vector<int>> cost(m+, vector<int>(n+));

        for(int i = ; i <= m; ++i){
            cost[i][] = i;
        }
        for (int j = ; j <= n; ++j) {
            cost[][j] = j;
        }
        for (int i = ; i <= m; ++i) {
            for (int j = ; j <= n; ++j) {
                if (word1[i-1] == word2[j-1]) {
                    cost[i][j] = cost[i-1][j-1];
                } else {
                    cost[i][j] =  + min(cost[i-1][j-1], min(cost[i][j-1], cost[i-1][j]));
                }             
            }
        }
        return cost[m][n];
    }
};

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/edit-distance

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法工程师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 作者:TeddyZhang,公众号:算法工程师之路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档