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.

  该题的解法摘自一博文

  各种情况分析则摘自另一博文

  我们维护的量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 };

 

posted @ 2015-06-11 23:03  峰子_仰望阳光  阅读(319)  评论(0编辑  收藏  举报