A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
思路:动态规划,用dp[][] 存储每位字符,作为独立字符存在的可能情况数以及作为后缀字符存在的情况数,特别注意0的存在
dp[i][0]表示 s[i] 作为独立字符 存在的情况数,其和前 i-1个字符排列总情况数相同 即
dp[i - 1][0] + dp[i - 1][1]
dp[i][1]表水s[i]作为 22 23 这样的组合数字的后一个字符存在的情况数 ,其只和第i-1个字符作为独立字符的情况数有关 即
dp[i - 1][0]
当有 0 的时候,除非 10,20 ,否则都是非法的。
class Solution {
public:
int numDecodings(string s) {
int n = s.size();
if (n == 0) return 0;
vector<vector<int>> dp(n, vector<int>(2, 0));
if(s[0]=='0') dp[0][0] = 0;
else dp[0][0] = 1;
dp[0][1] = 0;
for (int i = 1; i < n; i++){
if (s[i] != '0')
dp[i][0] += (dp[i - 1][0] + dp[i - 1][1]);
int tmp = (s[i - 1] - '0') * 10 + s[i] - '0';
if (tmp <= 26 && tmp>0)
dp[i][1] += dp[i - 1][0];
else if (s[i] == '0') return 0;
}
return dp[n - 1][0] + dp[n - 1][1];
}
};