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. 解码方法的主要内容,如果未能解决你的问题,请参考以下文章