LeetCode_91. 解码方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/all_about_WZY/article/details/101013186

题目描述:

一条包含字母 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) 。

思路:此题目采用从后向前解码的方式较为简单。申请n+1个空间的dp数组,dp[n]=1用于做初始化操作。此题的正确状态转移方程是 d p [ i ] = d p [ i + 1 ] + d p [ i + 2 ] dp[i]=dp[i+1]+dp[i+2] d p [ i + 1 ] dp[i+1] 表示 s [ i ] s[i] 单独进行解释, d p [ i + 2 ] dp[i+2] 表示 s [ i ] s [ i + 1 ] s[i]和s[i+1] 联合解释。这个题目不应该是这样的状态转移方程
d p [ i ] = { d p [ i + 1 ] i f s [ i ] + s [ i + 1 ] > 26 d p [ i + 1 ] + 1 i f s [ i ] + s [ i + 1 ] < = 26 dp[i]=\begin{cases} dp[i+1] & if s[i]+s[i+1]>26 \\ dp[i+1]+1 & if s[i]+s[i+1]<=26 \\ \end{cases}
因为无论如何 d p [ i ] = = = d p [ i + 1 ] dp[i]===dp[i+1] ,是否等于 d p [ i + 2 ] dp[i+2] 则需要进行判断

class Solution {
public:
    int numDecodings(string s) {
        int len=s.size();
        vector<int> dp(len+1);
        dp[len]=1;//初始化
        for(int i=len-1;i>=0;i--){
            if(s[i]=='0')
                dp[i]=0;//0无法单独作为一个数而且0也没有办法作为十位数
            else{
                dp[i]=dp[i+1];
                if(i+2<=len&&((s[i]-'0')*10+(s[i+1]-'0')<=26))
                    dp[i]+=dp[i+2];
            }
        }
        return dp[0];
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/all_about_WZY/article/details/101013186