解题思路:动态规划
创建一个数组dp记录到达每个位置时候次数
解码时候要么在该位置单独解码 要么就是和前一个位置共同解码
第一步考虑 下标0位置能否单独解码 如果可以单独解码dp[0]++ 在0位置有一种解码方式
假如在下标1位置 dp[1]的结果是多少呢
然后再考虑下标1位置本身能否单独解码 如果可以单独解码 dp[1]+=d[0]
然后考虑 0 1位置组合能否解码 如果能dp[1]++ 组合解码需要的范围是10-26 不然就是失败
那么在 i 位置一共有多少种解码方式呢?
计算在 i 位置的次数先单独解码 如果能单独解码dp[i]=d[i-1]
相当于在d[i-1]上接了一段 但次数肯定是没变化的
再考虑i位置和i-1位置能否组合解码 一旦判断能组合解码dp[i]+=dp[i-2]
相当于在i-2位置加上了一段所以次数和dp[i-2]相同
代码如下
class Solution {
public:
int numDecodings(string s)
{
//创建dp表
//初始化
//填表
//返回值
int n=s.size();
vector<int> dp(n+1);
if(s[0]!='0') dp[0]++;
if(s[1]!='0') dp[1]+=dp[0];//表示 前两个都能单独解码时候 下标为1位置有一种解法
int t= (s[0]-'0')*10 + s[1]-'0';
if(10<=t&&t<=26)dp[1]++;//前两位置组合能解码
for(int i=2;i<n;i++)
{
//i位置单独处理编码情况
if(s[i]!='0') dp[i]+=dp[i-1];
//i位置和i-1位置联合解码情况
t=(10<=(s[i-1]-'0')*10+s[i]-'0';
if(10 <=t&& t=26) dp[i]+=dp[i-2];
}
return dp[n-1];
}
};