zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    HTTP状态码详解
    phpcms v9调用多个栏目下文章的方法
    纯CSS3制作学生入学档案表单样式代码
    phpcmsv9 标题颜色显示问题
    Excel中利用IF和TIME函数计算出上下班状态!
    excel if判断时间段早晚班
    PHPCMS列表页伪静态
    EXCEL IF 函数 模糊查询
    如何用js实现截取一个字符串中的数字
    Elasticsearch学习之基本核心概念
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11219040.html
Copyright © 2011-2022 走看看