题目描述
思路分析
线性dp
f
[
i
]
:
前
i
个
字
符
构
成
的
解
码
方
案
数
.
则
转
移
方
程
为
:
f
[
i
]
=
f
[
i
−
1
]
+
f
[
i
−
2
]
,
但
有
条
件
:
当
s
[
i
]
!
=
‘
0
’
时
,
f
[
i
]
+
=
f
[
i
−
1
]
;
当
s
[
i
−
1
]
和
s
[
i
]
组
成
的
数
在
[
10
,
26
]
时
,
f
[
i
]
+
=
f
[
i
−
2
]
f[i]:前i个字符构成的解码方案数.则转移方程为:f[i]=f[i-1]+f[i-2],但有条件:当s[i]!=‘0’时,f[i]+=f[i-1];当s[i-1]和s[i]组成的数在[10,26]时,f[i]+=f[i-2]
f[i]:前i个字符构成的解码方案数.则转移方程为:f[i]=f[i−1]+f[i−2],但有条件:当s[i]!=‘0’时,f[i]+=f[i−1];当s[i−1]和s[i]组成的数在[10,26]时,f[i]+=f[i−2]
代码实现
class Solution {
public:
int numDecodings(string s) {
int n=s.size();
s=' '+s;
vector<int> f(n+1);
f[0]=1;
for(int i=1;i<=n;i++){
if(s[i]>='1'&&s[i]<='9') f[i]+=f[i-1];
if(i>1){
int t=(s[i-1]-'0')*10+s[i]-'0';
if(t>=10&&t<=26) f[i]+=f[i-2];
}
}
return f[n];
}
};