一条包含字母?A-Z 的消息通过以下方式进行了编码:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12"
输出: 2
解释:?它可以解码为 "AB"(1 2)或者 "L"(12)。
示例?2:
输入: "226"
输出: 3
解释:?它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
如果字符串长度为0或者开头为0,则肯定无法解码,返回0,所以之后开头肯定大于0,所以开头第一个元素已经考虑了,只有一个解码方式,初始化cur=1与pre=1,然后从第二个元素开始遍历:
2.如果s[i-1] = 1 或者 (s[i-1] = 2 && s[i] < 7),这时可以两种编码方式(以s[i-1]s[i]一起解码或s[i]单独解码),cur += pre;否则只有s[i]单独解码,cur不变
class Solution {
public:
int numDecodings(string s) {
int n = s.size();
if(n == 0) return 0;
if(s[0] == '0')return 0;//之后s[0]>=1
int i,ans = 0;
int cur = 1,pre = 1,tmp;//在第i步,实际cur = dp[i+1],pre = d[i-1],tmp = dp[i]
for(i = 1; i < n; i++)
{
tmp = cur;//因为cur将被覆盖
if(s[i] == '0')
{
if(s[i-1] == '1' || s[i-1] == '2')
cur = pre;
else
return 0;
}
else if(s[i-1] == '1' || (s[i-1] == '2' && s[i] < '7'))
cur += pre;
pre = tmp;
}
return cur;
}
};
原文:https://www.cnblogs.com/qujingtongxiao/p/11889557.html