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;
}
};
本文介绍了一种用于解码数字字符串的算法,该算法能够计算出一个由A到Z字母编码成数字的字符串的所有可能解码方式的数量。例如,对于字符串12,它可以被解码为AB(1 2)或者L(12),因此解码的方式共有2种。
3801

被折叠的 条评论
为什么被折叠?



