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 };
  • 相关阅读:
    printf,sprintf,fprintf的区别与联系
    linux repo init 遇到的问题
    POSTMAN使用说明
    HTTP协议-深入了解
    HTTP协议-详解篇
    HTTP协议-基础篇
    多线程学习
    I/O流
    String类学习&泛型
    集合
  • 原文地址:https://www.cnblogs.com/xiehongfeng100/p/4570457.html
Copyright © 2011-2022 走看看