这道题我一开始想用的是dfs,但是超时了。为什么会超时呢,应该是它的状态转移方程其实是只用两种情况的,而且没有那么多种变化情况需要记录,比如说如果是记录下不同的解码字符串,那么就要dfs,但是这里其实只要加减就可以了,所以应该想到用dp.
index表示的是以当前字符作为结尾时一共有多少种解码情况。有两种,一种是以一个字符加进去,还有一种就是要结合前一个字符,即10-16.
0的话要特殊判断一下,或者不在1-26时就要拆成一个一个的,不可能作为10-26来解码。
class Solution {
public:
int numDecodings(string s) {
vector<int>dp(s.size(),0);
dp[0] = s[0] - '0' == 0 ? 0 : 1;
for(int i = 1;i<s.size();i++)
{
//只考虑一个的情况
if(s[i] != '0') dp[i] += dp[i-1];
//2
if(s[i] == '0')
{
if(s[i-1] == '1' || s[i-1] == '2')
dp[i] += i-2 >=0 ? dp[i-2] : 1;
else
return 0;
}
//2
else if(s[i-1] == '1' || s[i-1] == '2' && s[i] <= '6')
dp[i] += i-2 >=0 ? dp[i-2] : 1;
}
return dp[s.size()-1];
}
};