512. 解码方法
中文English
有一个消息包含A-Z通过以下规则编码
'A' -> 1
'B' -> 2
...
'Z' -> 26
现在给你一个加密过后的消息,问有几种解码的方式
样例
样例 1:
输入: "12"
输出: 2
解释: 它可以被解码为 AB (1 2) 或 L (12).
样例 2:
输入: "10"
输出: 1
注意事项
we can't decode an empty string. So you should return 0 if the message is empty.
class Solution {
public:
/**
* @param s: a string, encoded message
* @return: an integer, the number of ways decoding
*/
int numDecodings(string &s) {
// write your code here
int n = s.length();
if(n == 0){
return 0;
}
//还是求前i个的问题,所以还是开n+1的数组
int *f = new int[n + 1];
//初始化前0个的情况
//前0个,就是空串,空串那就对应一种解密方式,那密码就是空嘛
f[0] = 1;
for(int i = 1; i <= n; i++){
//每次初始化为0种方式
f[i] = 0;
//把最后一个字符转化成数字
int t = s[i - 1] - '0';
if(t >= 1 && t <= 9){
//把最后一个数字单独看成一个字母的前i个的解密方式
f[i] += f[i - 1];
}
//如果i>=2说明至少有两个字符
if(i >= 2){
//倒数前两个字符转化为数字
t = (s[i - 2] - '0') * 10 + s[i - 1] - '0';
if(t >= 10 && t <= 26){
//把最后两个数字看成一个字母的前i个的解密方式
f[i] += f[i - 2];
}
}
}
return f[n];
}
};