题目描述
Decode Ways
A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1
'B' -> 2
...
'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
题目分析
这个我最终找到一个类似费波那契的解法。
我们定义
sum[i] 表示以s[i]...s[s.size()-1]这一段字符的编码方法种数。
那么可以得到以下规律
如果 s[i] t s[i+1] 能组成一个新的字符的如 1和2能组合成12来表示L
那么s[i] = s[i+1] + s[i+2]
否则
s[i] = s[i+1];
这里有几个需要注意的地方。
如果s[i] = '0' 那么 sum[i] = 0;
为了记录之前的结果,我们选择从后往前遍历数据,就可以
是后sum[0]就是我们要求的结果。
总结
代码示例
class Solution {
public:
int numDecodings(string s) {
if(s.size() == 0) return 0;
vector<int> sum(s.size(),-1);
//return numDecodingsCore(s,0,sum);
for(int i = s.size()-1;i>=0;i--)
{
if(s[i]<= '9' && s[i]>'0') //所有位都必须是 1-9 注意对0的处理
{
if(i == s.size()-1)
sum[i] = 1;
else
{
if((s[i]-'0')*10+s[i+1]-'0' <= 26)
{
if(i == s.size()-2)
sum[i] = sum[i+1]+ 1;
else
sum[i] = sum[i+1]+ sum[i+2];
}
else
sum[i] = sum[i+1];
}
}
else if(s[i] == '0')
{
sum[i] = 0;
}
else
return 0;
}
return sum[0];
}
};
class Solution {
public:
int numDecodings(string s) {
if(s.size() == 0) return 0;
vector<int> sum(s.size(),-1);
//return numDecodingsCore(s,0,sum);
for(int i = s.size()-1;i>=0;i--)
{
if(s[i]<= '9' && s[i]>'0') //所有位都必须是 1-9 注意对0的处理
{
if(i == s.size()-1)
sum[i] = 1;
else
{
if((s[i]-'0')*10+s[i+1]-'0' <= 26)
{
if(i == s.size()-2)
sum[i] = sum[i+1]+ 1;
else
sum[i] = sum[i+1]+ sum[i+2];
}
else
sum[i] = sum[i+1];
}
}
else if(s[i] == '0')
{
sum[i] = 0;
}
else
return 0;
}
return sum[0];
}
};
推荐学习C++的资料
C++标准函数库
在线C++API查询
vector使用方法