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-26组成的数字,求一共有多少种拆分方法。
思路:
如果没有0干预,就会很好做。但是有0在,就得细分情况了。
首先不管0了,分成两种情况。
一,可以拆分成s[i]和s[i-1]既可以合在一起又可以分开,即他们组成的数在0-26区间内。
二,它们只能拆开。
对于第一种情况,如果没有0干预,那么dp[i]=dp[i-1]+dp[i-2],注意i<2时,dp[i-2]用1代替,如果s[i]='0',那么只能与s[i-1]一起构成数了,那么dp[i]=dp[i-2]。
对于第二种情况,如果没有0,那么dp[i]=dp[i-1],否则就不能拆分了,例如:12807,就直接返回0.
代码:
class Solution {
public:
int numDecodings(string s) {
int n=s.length();
if(n==0||s[0]=='0')
return 0;
int dp[n];
dp[0]=1;
for(int i=1;i<n;i++)
{
if(s[i-1]=='1'||(s[i-1]=='2'&&s[i]-'6'<=0))
{
if(s[i]!='0')
dp[i]=dp[i-1]+(i-2>=0?dp[i-2]:1);
else
dp[i]=(i-2>=0?dp[i-2]:1);
}
else
{
if(s[i]!='0')
dp[i]=dp[i-1];
else
return 0;
}
}
return dp[n-1];
}
};