题目:leetcode
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.
分析:
1、先检查有没有不能解码的情况:s为空,连续两个零,零前面的数字比2大,s[0]是0等等。
2、s[0]的解码方式只有一种。
3、从s[1]开始,s[i]的解码方式首先等于s[i-1],然后在s[i+1]不是零的前提下,若s[i-1]和s[i]组成11-19或21-26,则s[i]的解码方式再加上s[i-2]的解码方式(特别地,若i-2小于零,则s[i]的解码方式加1)。
int numDecodings(string s) {
if(s.empty())
return 0;
if(s[0]=='0')
return 0;
for(int i=1;i<s.size();i++)
{
if(s[i]=='0')
{
if(s[i-1]=='0')
return 0;
if(s[i-1]>='3')
return 0;
}
}
vector<int> f(s.size(),0);
f[0]=1;
int i;
for(i=1;i<s.size()-1;i++)
{
f[i]+=f[i-1];
if(s[i]!='0')
{
if( <span style="line-height: 26.3999996185303px; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;">(s[i+1]!='0') && </span>(s[i-1]=='1' || (s[i-1]=='2' && s[i]>='1' && s[i]<='6')) )
{
if(i-2>=0)
f[i]+=f[i-2];
else
f[i]++;
}
}
}//for循环结束
f[i]+=f[i-1];
if(s[i]!='0')
{
if( s[i-1]=='1' || (s[i-1]=='2' && s[i]>='1' && s[i]<='6'))
{
if(i-2>=0)
f[i]+=f[i-2];
else
f[i]++;
}
}
return f[s.size()-1];
}