标签:pre 字符串 动态 输入 判断 ret 注意 需要 方式
题目描述:
一条包含字母 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 };
标签:pre 字符串 动态 输入 判断 ret 注意 需要 方式
原文地址:https://www.cnblogs.com/LJ-LJ/p/11219040.html