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.
考虑对于s[i]
若本身>=0 && <=9 则 dp[i]=dp[i-1]
若s[i-1]*10+s[i] >=10 && <=26 则dp[i]=dp[i-1]+dp[i-2]
class Solution {
public:
int numDecodings(string s) {
int dp[10000];
int len=s.length();
for(int i=0;i<10000;i++)
dp[i]=0;
if(judge1((int)(s[0]-'0'))){
dp[0]=1;
}
else
return 0;
if(len==1) return dp[0];
int digit=((int)(s[1]-'0'));
int temp=((int)(s[0]-'0'))*10+((int)(s[1]-'0'));
if(judge1(digit)&&judge2(temp)){
dp[1]=2;
}
else if(judge1(digit)&&(!judge2(temp))){
dp[1]=1;
}
else if((!judge1(digit))&&judge2(temp)){
dp[1]=1;
}
else return 0;
for(int i=2;i<len;i++){
int digit=((int)(s[i]-'0'));
int temp=((int)(s[i-1]-'0'))*10+((int)(s[i]-'0'));
if(judge1(digit)&&judge2(temp)){
dp[i]=dp[i-1]+dp[i-2];
}
else if(judge1(digit)&&(!judge2(temp))){
dp[i]=dp[i-1];
}
else if((!judge1(digit))&&judge2(temp)){
dp[i]=dp[i-2];
}
}
return dp[len-1];
}
bool judge1(int one){
if(one>=1&&one<=9) return true;
return false;
}
bool judge2(int two){
if(two>=10&&two<=26) return true;
return false;
}
};