标签:
题目要求:
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.
该题的解法摘自一博文。
各种情况分析则摘自另一博文。
我们维护的量res[i]是表示前i个数字有多少种解析的方式,接下来来想想递归式,有两种方式:第一种新加进来的数字就是自己表示一个字符,那么解析的方式有res[i-1]种,第二种就是新加进来的数字和前一个数字凑成一个字符,解析的方式有res[i-2]种(因为上一个字符和自己凑成了一个)。当然这里要判断前面说的两种情况能否凑成一个字符,也就是范围的判断,如果可以才有对应的解析方式,如果不行,那么就是0。最终结果就是把这两种情况对应的解析方式相加。这里可以把范围分成几个区间:
(1)00:res[i]=0(无法解析,没有可行解析方式);
(2)10, 20:res[i]=res[i-2](只有第二种情况成立);
(3)11-19, 21-26:res[i]=res[i-1]+res[i-2](两种情况都可行);
(4)01-09, 27-99:res[i]=res[i-1](只有第一种情况可行);
程序如下:
1 class Solution { 2 public: 3 int numDecodings(string s) { 4 int sz = s.size(); 5 if(sz == 0) 6 return 0; 7 8 vector<int> dp(sz + 1, 0); 9 dp[0] = 1; 10 dp[1] = (s[0] != ‘0‘) ? 1 : 0; 11 for(int i = 2; i < sz + 1; i++) 12 { 13 if(s[i - 1] != ‘0‘) 14 dp[i] = dp[i - 1]; 15 else 16 dp[i] = 0; 17 18 if(s[i - 2] == ‘1‘ || (s[i - 2] == ‘2‘ && s[i - 1] <= ‘6‘)) 19 dp[i] += dp[i - 2]; 20 } 21 22 return dp[sz]; 23 } 24 };
标签:
原文地址:http://www.cnblogs.com/xiehongfeng100/p/4570457.html