一条包含字母 A-Z 的消息通过以下方式进行了编码:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
题目数据保证答案肯定是一个 32 位的整数。
示例 1:
输入:"12"
输出:2
解释:它可以解码为 "AB"(1 2)或者 "L"(12)。
dp[i]表示从位置0开始长度为i的字符串中解码方法的总数,合法字母是1或者2位数,首先s[:i-1]的解码方式后加上s[i]也是合法的(s[i]!=0),对于s[:i-2],要看s[i-2:i-1]是否小于26,如果小于26,那么s[:i-2]、s[i-2:i-1]、s[i]也是合法的
dp[i] = dp[i-1](s[i-1]!=0) + dp[i-2](s[i-2:i-1]<=26)
class Solution {
public:
int numDecodings(string s) {
int n = s.size();
if(!n) return 0;
int *dp = new int[n + 1]();
dp[0] = 1;
dp[1] = (s[0] == '0' ? 0 : 1);
for(int i = 2; i <= n; i++)
{
//s[i]!=0
if(s.substr(i-1, 1) != "0")
dp[i] += dp[i-1];
if(s.substr(i-2, 1) == "0")
continue;
//s[i-2:i-1] <= 26
if(stoi(s.substr(i-2, 2)) <= 26)
dp[i] += dp[i-2];
}
return dp[n];
}
};