思路:
用ans[i]表示从第1位到第i位有多少种解码方式。
初始化ans[0] 和 ans[1] 为1
注意 ans 和 str 的起始坐标不同,所以 ans[i+1] 和 str[i] 对应
如果str[i] != '0' 那么它就可以作为一个单独字母解码 ans[i+1] = ans[i]
如果 str[i-1] 和 str[i] 可以作为有效解码,那么 ans[i+1] += ans[i-1]
然后递推
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int main(){
string str;
int ans[10000];
int n;
while(cin>>str&&str!="0"){
memset(ans,0,sizeof(ans));
ans[0] = 1;ans[1] = 1;
n = str.size();
for(int i=1;i<n;++i){
if(str[i]!='0') ans[i+1] = ans[i];
if(str[i-1]=='1'||(str[i-1]=='2'&&str[i]<'7')) ans[i+1] += ans[i-1];
}
cout<<ans[n]<<endl;
}
return 0;
}