题目描述
一条仅包含字母‘A’-‘Z’的消息用下列的方式加密成数字
'A' -> 1↵'B' -> 2↵...↵'Z' -> 26
现在给出加密成数字的密文,请判断有多少种解密的方法
例如:
给出的密文为“12”,可以解密为"AB"(1 2) 或者"L"(12).
所以密文"12"的解密方法是2种.
解题思路
class Solution {
public:
int numDecodings(string s) {
if(s.length()==0 || s[0] == '0')
return 0;
int len = s.length();
vector<int> dp(len + 1, 0); //初始化容器,大小为len+1, 内容为0
dp[0] = 1; // 当有0个字符时候的编码个数,当有连续两个字符能编码时f[i] = f[i-2],保证f[0]有值
dp[1] = 1; // 字符串长度为1时的编码个数
for(int i = 2; i <= len; i++){
if( s[i - 1] >= '1' && s[i - 1] <= '9') //如果属于[1,9],那么这可以解释为一种编码
dp[i] = dp[i - 1]; //那么dp[i]就等于dp[i-1],前i-1个有dp[i-1]种方法。
if( s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] >= '0' && s[i - 1] <= '6'))
dp[i] += dp[i - 2]; //表明两个数字编码一个字母,dp[i]为之前记录的dp[i]+dp[i-2]
}
return dp[len];
}
};