Decode Ways
A message containing letters from
A-Zis being encoded to numbers using the following mapping:'A' -> 1 'B' -> 2 ... 'Z' -> 26Given 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.
//动态规划,和上台阶那道题很类似。
//取string s的前n个字符,记f(n)为这n个字符的所有可能的decoding ways。
//如果s[n]可以被decode,(s[n]在1~9之间),f(n) = f(n - 1);
//如果s[n - 1]和s[n]组合起来可以被一起decode,且s[n]可以被decode。则f(n) = f(n - 2) + f(n - 1);
//如果s[n - 1]和s[n]组合起来可以被一起decode,但s[n]不能被decode。则f(n) = f(n - 2);
//如果上式都不满足,则返回0
class Solution {
public:
int numDecodings(string s) {
size_t len = s.size();
if(len == 0){
return 0;
}
else if(len == 1){
if(s[0] == '0'){
return 0;
}
else{
return 1;
}
}
else if(len == 2){
if(s[0] == '0' || (s[0] > '2' && s[1] == '0')){
return 0;
}
int value = (s[0] - '0') * 10 + s[1] - '0';
if(value <= 26 && s[1] != '0'){
return 2;
}
else{
return 1;
}
}
else{
int dp[len];
dp[0] = numDecodings(s.substr(0, 1));
dp[1] = numDecodings(s.substr(0, 2));
if(dp[0] == 0 || dp[1] == 0){
return 0;
}
for(int i = 2; i < len; i++){
int value = s[i] - '0';
if(value <= 9 && value >= 1){
dp[i] = dp[i - 1];
int value2 = (s[i - 1] - '0') * 10 + s[i] - '0';
if(value2 <= 26 && s[i - 1] != '0'){
//2 digits decode available
dp[i] += dp[i - 2];
}
}
else{
//digit == 0
int value2 = (s[i - 1] - '0') * 10 + s[i] - '0';
if(value2 <= 26 && s[i - 1] != '0'){
//2 digits decode available
dp[i] = dp[i - 2];
}
else{
return 0;
}
}
}
return dp[len - 1];
}
}
};
