原题:
解决方法:
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时,没有有效解法。
- 当数字是0时,只能当成二位数解,所有dp[i+1] = dp[i-1].
- 当前一个数字是1时,或前一个数字是2而当前数字小于等于6时,说明当前数字有两种解法,既可以当成1位数,也可以当成二位数也就是 d[i+1] = dp[i] + dp[i-1].
int numDecodings(string s) {
if (s.empty() || s[0] == '0')
return 0;
int n = s.size();
vector<int> dp(n+1, 0);
dp[0] = 1;
for(int i = 0; i < n;i++){
dp[i+1] = s[i] == '0' ? 0 : dp[i];
if (i > 0 && (s[i-1] == '1' || (s[i-1]=='2' && s[i] <= '6' ) ) ){
dp[i+1] += dp[i-1];
}
}
return dp[n];
}