zoukankan      html  css  js  c++  java
  • LeetCode 091. 解码方法 DP

    地址 https://leetcode-cn.com/problems/decode-ways/submissions/

    一条包含字母 A-Z 的消息通过以下映射进行了 编码 :
    
    'A' -> 1
    'B' -> 2
    ...
    'Z' -> 26
    要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。
    例如,"111" 可以将 "1" 中的每个 "1" 映射为 "A" ,从而得到 "AAA" ,或者可以将 "11""1"(分别为 "K""A" )映射为 "KA" 。
    注意,"06" 不能映射为 "F" ,因为 "6""06" 不同。
    
    给你一个只含数字的 非空 字符串 num ,请计算并返回 解码 方法的 总数 。
    
    题目数据保证答案肯定是一个 32 位 的整数。
    
     
    
    示例 1:
    
    输入:s = "12"
    输出:2
    解释:它可以解码为 "AB"1 2)或者 "L"12)。
    示例 2:
    
    输入:s = "226"
    输出:3
    解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
    示例 3:
    
    输入:s = "0"
    输出:0
    解释:没有字符映射到以 0 开头的数字。
    含有 0 的有效映射是 'J' -> "10"'T'-> "20" 。
    由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。
    示例 4:
    
    输入:s = "1"
    输出:1
     
    
    提示:
    
    1 <= s.length <= 100
    s 只包含数字,并且可能包含前导零。
    
     

    算法1
    使用DP
    分析集中简单情况
    “0” “90” 是无法解码的
    “10” “20” “9” “1” “2” 只有一种解码方法

    “12” “19” “21” “26” 有两种解码方法

    “27” “29” 只有一种解码办法

     

    综上所述 有两种特殊情况需要分析

    1 0数字 要么和前面的1 2 组成字母 要么无法解码
    2 2数字 要么和后面的数字组成26到20的字母或者拆开单独解码 要么只能和前面的数字单独解码
    那么使用dp
    dp[i]表示第i个字符串可能组成的解数目

    //========================================================================================

     

    class Solution {
    public:
        int dp[110];
        int numDecodings(string s) {
            memset(dp, 0, sizeof(dp));
            s.insert(s.begin(), '#');
            dp[0] = 1;
            for (int i = 1; i < s.size(); i++) {
                if(s[i] == '0' ){
                    if(s[i-1] == '1'|| s[i-1] == '2' ){ dp[i] = dp[i-2];continue;}
                    else{return 0;}
                }else if(s[i - 1] == '1' || ( s[i - 1] == '2' && s[i] >= '1' && s[i] <= '6' )  ){
                    dp[i] = dp[i - 1] + dp[i-2];
                }else {
                    dp[i] = dp[i - 1];
                }
            }
            return  dp[s.size() - 1];
        }
    };
    
     

     

  • 相关阅读:
    计算机硬件知识整理
    cf689d ST表RMQ+二分
    hdu5289 ST表+二分
    hdu5443 ST表裸题:求区间最大
    poj3264 倍增法(ST表)裸题
    cf932d 树上倍增
    zoj3195 联通树上三个点的路径长
    hdu6107 倍增法st表
    hdu2586 lca倍增法
    poj1470 LCA倍增法
  • 原文地址:https://www.cnblogs.com/itdef/p/14257188.html
Copyright © 2011-2022 走看看