• 91. 解码方法


    91. 解码方法

    一条包含字母 A-Z 的消息通过以下映射进行了 编码

    'A' -> "1"
    'B' -> "2"
    ...
    'Z' -> "26"

    解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:

    • "AAJF" ,将消息分组为 (1 1 10 6)
    • "KJF" ,将消息分组为 (11 10 6)

    注意,消息不能分组为  (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6""06" 在映射中并不等价。

    给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数

    题目数据保证答案肯定是一个 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" 。
    由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。
    

    提示:

    • 1 <= s.length <= 100
    • s 只包含数字,并且可能包含前导零。

    解析:

    第一次用dfs + set做的,当然超时

    所以就用dp做了,很简单

    dp[i][0]表示以第i个字符结尾,且第i个字符单独放置的方法数

    dp[i][1]表示以第i个字符结尾,且第i个字符与前面一个一起放置的方法数

    递推式

    dp[i][0] = dp[i - 1][0] + dp[i - 1][1]

    dp[i][1] = dp[i - 1][0]

    class Solution {
    public:
        vector<string> ss;
    
        int cal(string str)
        {
            int ret = 0;
            for(int i = 0; i < str.length(); i++)
            {
                ret *= 10;
                ret += str[i] - '0';
            }
            return ret;
    
    
        }
    
        int numDecodings(string s) {
            int dp[110][2];
            memset(dp, 0, sizeof(dp));
            dp[0][1] = 0;
            if(s[0] == '0')
            {
                dp[0][0] = 0;
            }
            else dp[0][0] = 1;
            for(int i = 1; i < s.length(); i++)
            {
                if(s[i] != '0')
                    dp[i][0] = dp[i - 1][0] + dp[i - 1][1];
                string temp = "";
                temp += s[i - 1];
                temp += s[i];
                if(s[i - 1] != '0')
                {
                    int idx = cal(temp);
                    if(idx >= 1 && idx <= 26)
                        dp[i][1] = dp[i - 1][0];
                }
            }
            int n = s.length();
            return dp[n - 1][0] + dp[n - 1][1];
        }
    };
  • 相关阅读:
    痛苦之旅——安装Eric4
    如何把自己写的python程序给别人用
    (转)史上最好的Python线程指南
    (转)python编码问题
    Beautiful Soup的一些中文资料
    oracle监听配置
    redhat6.5安装oracle 11g
    《深入浅出MFC》– Document-View深入探讨
    CAS解扰小结
    ts包、表、子表、section的关系
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/16625865.html
Copyright © 2020-2023  润新知