leetcode 91. 解码方法

Posted lj-lj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ;

 

以上是关于leetcode 91. 解码方法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode#91-解码方法

LeetCode 91 动态规划 Decode Ways 解码方法

leetcode 91. 解码方法

leetcode 91. 解码方法

leetcode-91-解码方法

leetcode-91-解码方法