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.
这个题目细节处理比较繁琐,耐心做下去就OK
class Solution {
public:
int numDecodings(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int p,length,num,i;
p=0,length=s.size(),num=1;
if(length==0)
return 0;
for(i=0 ; i<length ; i++){
if(s[i]>'2' || s[i]=='0'){
string temp(s.begin()+p,s.begin()+i+1);
num*=_numDecodinglessthantwo(temp);
p=i+1;
}
}
if(p!=i)
num*=_numDecodinglessthantwo(string(s.begin()+p,s.begin()+i));
return num;
}
int _numDecodinglessthantwo(string s){
int length=s.size();
if(length==0)
return 0;
if(s[0]=='0' )
return 0;
if(length==1)
return 1;
char c=s[length-1];
if(c=='0' && length==2)
return 1;
string t789(s.begin(),s.end()-1);
string t789e(s.begin(),s.end()-2);
if(c>'6' && c<='9'){
if(s[length-2]=='2')
return fibo(length-1);
else
return fibo(length);
}
else if(c=='0')
return _numDecodinglessthantwo(t789e);
else if(c>'0' && c<'7')
return fibo(length);
else
return 0;
}
int fibo(int n){
int prev=1;
int pprev=0;
int cur=0;
for(int i=1 ; i<=n ; i++){
cur=prev+pprev;
pprev=prev;
prev=cur;
}
return cur;
}
};