动态规划,注意f[0]边界为1;
int numDecodings(char * s){
int n = strlen(s);
int f[n+1];
memset(f,0,sizeof(f));
f[0]=1;
for(int i=1;i<=n;i++){
//choose one
if(s[i-1]!='0'){
f[i]+=f[i-1];
}
//choose two
if(i> 1 && (s[i-2]=='1' || s[i-2]=='2'&&s[i-1]<'7')){
f[i]+=f[i-2];
}
}
return f[n];
}
优化版
int numDecodings(char * s){
int n = strlen(s);
int p=0,q=1;
int t = 0;
for(int i=1;i<=n;i++){
//choose one
if(s[i-1]!='0'){
t+=q;
}
//choose two
if(i> 1 && (s[i-2]=='1' || s[i-2]=='2'&&s[i-1]<'7')){
t+=p;
}
p=q,q=t,t=0;
}
return q;
}