zoukankan      html  css  js  c++  java
  • LeetCode之“动态规划”:Decode Ways

      题目链接

      题目要求:

      A message containing letters from A-Z is being encoded to numbers using the following mapping:

    'A' -> 1
    'B' -> 2
    ...
    'Z' -> 26

      Given an encoded message containing digits, determine the total number of ways to decode it.

      For example,
      Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).

      The number of ways decoding "12" is 2.

      该题的解法摘自一博文

      各种情况分析则摘自另一博文

      我们维护的量res[i]是表示前i个数字有多少种解析的方式,接下来来想想递归式,有两种方式:第一种新加进来的数字就是自己表示一个字符,那么解析的方式有res[i-1]种,第二种就是新加进来的数字和前一个数字凑成一个字符,解析的方式有res[i-2]种(因为上一个字符和自己凑成了一个)。当然这里要判断前面说的两种情况能否凑成一个字符,也就是范围的判断,如果可以才有对应的解析方式,如果不行,那么就是0。最终结果就是把这两种情况对应的解析方式相加。这里可以把范围分成几个区间:
      (1)00:res[i]=0(无法解析,没有可行解析方式);
      (2)10, 20:res[i]=res[i-2](只有第二种情况成立);
      (3)11-19, 21-26:res[i]=res[i-1]+res[i-2](两种情况都可行);
      (4)01-09, 27-99:res[i]=res[i-1](只有第一种情况可行);

      程序如下:

     1 class Solution {
     2 public:
     3     int numDecodings(string s) {
     4         int sz = s.size();
     5         if(sz == 0)
     6             return 0;
     7             
     8         vector<int> dp(sz + 1, 0);
     9         dp[0] = 1;
    10         dp[1] = (s[0] != '0') ? 1 : 0;
    11         for(int i = 2; i < sz + 1; i++)
    12         {
    13             if(s[i - 1] != '0')
    14                 dp[i] = dp[i - 1];
    15             else
    16                 dp[i] = 0;
    17             
    18             if(s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] <= '6'))
    19                 dp[i] += dp[i - 2];
    20         }
    21         
    22         return dp[sz];
    23     }
    24 };
  • 相关阅读:
    令人恼怒!mount windows共享目录出错
    今天修改PCB板图
    在深圳出差
    触摸屏技术原理介绍
    getrlimit和setrlimit函数
    OpenCV下的HelloWorld
    两本OpenCV的书到了
    GDB用法小结
    没搞懂自适应二进制阈值化的参数
    【JavaScript】73 逆序的三位数 (10分)
  • 原文地址:https://www.cnblogs.com/xiehongfeng100/p/4570457.html
Copyright © 2011-2022 走看看