分析
解码时s[i]要么与前面的字母s[i-1]一起解码,要么就分开自己成为新解码,用f[i]表示第i个字母有多少种解法,那么转移转移方程f[i]=f[i-1]+f[i-2],同时要保证一起解码时要<=26。
class Solution {
public:
int numDecodings(string s) {
int n=s.length();
vector<int>f(n+1);
f[0]=1;//空字符串只有一种解法
for(int i=1;i<=n;i++){
if(s[i-1]!='0')f[i]+=f[i-1];//选择s[i-1]
if(i>1&&s[i-2]!='0'&&(s[i-2]-'0')*10+(s[i-1]-'0')<=26)//不选s[i-2]
f[i]+=f[i-2];
}
return f[n];
}
};