题目地址:
https://leetcode.com/problems/decode-ways/
给定一个数字组成的字符串,每个字符或两个字符可以被解码成大写字母,问对于某个字符串,能解码成多少种方式。思想是动态规划。设
f
[
i
]
f[i]
f[i]是
s
[
1
,
.
.
.
,
i
]
s[1,...,i]
s[1,...,i]能解码的方式总数(
i
i
i从
1
1
1开始计数,以下一样),那么这些解码方式是下面两种情况之和:
1、若
s
[
i
]
s[i]
s[i]可以解码成字母,这种情况有
f
[
i
−
1
]
f[i-1]
f[i−1]种方式;
2、若
s
[
i
−
1
,
i
]
s[i-1,i]
s[i−1,i]可以解码成字母,这种情况有
f
[
i
−
2
]
f[i-2]
f[i−2]种方式。
判断一下是否符合条件,再把两种情况求个和即可。代码如下:
class Solution {
public:
int numDecodings(string s) {
int n = s.size();
int f[n + 1];
memset(f, 0, sizeof f);
// 空串的解码方式只有一种,就是空串
f[0] = 1;
for (int i = 1; i <= n; i++) {
int b = s[i - 1] - '0';
if (1 <= b && b <= 9) f[i] += f[i - 1];
if (i >= 2) {
int a = s[i - 2] - '0';
if (a == 1 || (a == 2 && b <= 6)) f[i] += f[i - 2];
}
}
return f[n];
}
};
时空复杂度 O ( n ) O(n) O(n)。