思路是动态规划的思路:dp[i]表示前i个字符串解码方法的总数,为了避免边界情况,i从1开始。
对于第i位来说,如果第i位不是0,那么dp[i] 可以从dp[i-1]转移过来,如果第i-1位和第i位是10-26的数,那么dp[i]可以从dp[i-2]转移过来。
写代码:
class Solution {
public:
int numDecodings(string s) {
// 动态规划 dp[i] 表示前i个字符的解码方式
s = " "+s;
int n = s.size();
vector<int> dp(n);
dp[0] = 1;
dp[1] = (s[1]=='0'?0:1);
for(int i=2;i<n;i++){
if(s[i]!='0') dp[i]+=dp[i-1];
if(s[i-1]=='1'||(s[i-1]=='2'&&s[i]<='6')) dp[i]+=dp[i-2];
}
return dp[n-1];
}
};