题目来源 : leetcode 91
链接 :https://leetcode.cn/problems/decode-ways/description/
思路
按照动态规划的基本思路 , 将问题转化为子问题,有n个字符,我们只需要考虑第n-1个字符所要判断的情况
首先自己能不能被解码:
首要条件是自己本身不要等于0,只要不等于0,那么就可以被解码为一个字符,
所以这种情况的转移方程为:
dp[number] = dp[number - 1] (value[number] != 0)
此外还要判断是否可以与前一个字符构成可解码样式:
那么这个时候的方案数就会等于之前两个的方案数
所以转移方程为:
dp[number] = dp[number - 2] (10 <= (value[number - 1] - '0') * 10 + value[number] - '0' <= 26 )(value[number - 1] != '0')
所以dp[number]的值就是这两种情况之和
上代码
int numDecodings(char* s) {
int n = strlen(s);
int f[n + 1];
memset(f, 0, sizeof(f));
f[0] = 1; //没有字符我们设为1,为一个字符做铺垫
for (int i = 1; i <= n; ++i) {
if (s[i - 1] != '0') {
f[i] += f[i - 1];
}
if (i > 1 && s[i - 2] != '0' && ((s[i - 2] - '0') * 10 + (s[i - 1] - '0') <= 26)) {
f[i] += f[i - 2];
}
}
return f[n];
}