leetcode 91. 解码方法

题目描述:

一条包含字母 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) 。

 

解题思路:

这道题用动态规划求解。dp[i]表示包含了该位置时的最大编码数。需要判断的是当前位的字符和前一位字符所组成的两位数的大小是否是小于26的,若是,则dp[i]=dp[i-2]+dp[i-1],否则dp[i]=dp[i-1]。需要特别注意的是这里"0"的情况需要单独拿出来讨论。首先0位于开头的情况直接可以判定无法编码,直接返回0,包含“0”的情况只有"10"或"20",也就是需要判定当前位置是否为"0",若是,需要判断其前面一位是否为“1”或“2”,若是,此时的dp[i] = dp[i-2],否则无法编码。

 

代码:

 1 class Solution {
 2 public:
 3     int numDecodings(string s) {
 4         if(s.size() == 0)
 5             return s.size();
 6         if(s[0] == '0')
 7             return 0;
 8         if(s.size() == 1 && s[0] != '0')
 9             return 1;
10         vector<int> dp(s.size(), 0);
11         dp[0] = 1;
12         if(s[1] == '0')
13         {
14             if((s[0]-'0')*10 + (s[1]-'0') == 10 || (s[0]-'0')*10 + (s[1]-'0') == 20)
15             {
16                 dp[1] = 1;
17             }
18             else
19             {
20                 return 0;
21             }
22         }
23         else
24         {
25             if((s[0] - '0')*10 + (s[1] - '0') <= 26)
26                 dp[1] = dp[0] + 1;
27             else
28                 dp[1] = 1;
29         }
30         for(int i = 2; i<s.size(); i++)
31         {
32             if(s[i] == '0')
33             {
34                 if((s[i-1]-'0')*10 + (s[i]-'0') == 10 || (s[i-1]-'0')*10 + (s[i]-'0') == 20)
35                 {
36                     dp[i] = dp[i-2];
37                 }
38                 else
39                 {
40                     return 0;
41                 }
42             }
43             else
44             {
45                 if(s[i-1] == '0')
46                 {
47                     dp[i] = dp[i-1];
48                 }
49                 else
50                 {
51                     if((s[i-1]-'0')*10 + (s[i]-'0') <= 26)
52                     {
53                         dp[i] = dp[i-2] + dp[i-1];
54                     }
55                     else
56                     {
57                         dp[i] = dp[i-1];
58                     }
59                 }
60             }
61         }
62         return dp[s.size()-1];
63     }
64 };

 

posted @ 2019-07-20 20:00  Fzu_LJ  阅读(213)  评论(0编辑  收藏  举报