题意
A到Z分别用0到26去编码,现在要求我们去解码,比如我们有“12”,可以解码为”AB“, 或者”L“。
给定一个数字串,求解码的方式一共有多少种。
思路
状态表示:d[i],到第i位的解码方式。
转移方程:d[i]=d[i−1]+d[i−2]
转移方程很好列出来,但是转移条件要考虑清楚。
当d[i]+=d[i−1]的时候:要求s[i]必须为1到9之间的数。
当d[i]+=d[i−2]的时候,要求s[i - 1]和s[i]组成的2位数必须在10到26之间。
代码
class Solution {
public:
bool judge(char x, char y) {
int a = x - '0';
int b = y - '0';
if (a * 10 + b >= 10 && a * 10 + b <= 26) return true;
return false;
}
int numDecodings(string s) {
int n = s.length();
if (n == 0) return 0;
vector<int> d(n, 0);
if (s[0] != '0') d[0] = 1;
for (int i = 1; i < n; i++) {
if (s[i] == '0') {
if (i < 1) continue;
if (s[i - 1] == '1' || s[i - 1] == '2') {
if (i > 1) d[i] += d[i - 2];
else d[i] += 1;
}
} else {
d[i] = d[i - 1];
if (i >= 1) {
if (judge(s[i - 1], s[i])) {
if (i > 1) d[i] += d[i - 2];
else d[i] += 1;
}
}
}
}
return d[n - 1];
}
};