zoukankan      html  css  js  c++  java
  • 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.

    思路:

    典型的动规,用n[i]表示从i到末尾的表示法,然后对于每一个i,判断s[i]和s[i]+s[j]能否解码,再分别加上n[i+1]和n[i+2]即可。

    代码:

     1     int numDecodings(string s) {
     2         // IMPORTANT: Please reset any member data you declared, as
     3         // the same Solution instance will be reused for each test case.
     4         int l = s.length();
     5         if(l == 0)
     6             return 0;
     7         if(l == 1)
     8             return s[0] > '0';
     9         int ways[l];
    10         int i;
    11         ways[l-1] = s[l-1] > '0';
    12         if(s[l-2] == '0')
    13             ways[l-2] = 0;
    14         else{
    15             if((s[l-2]-'0')*10+s[l-1]-'0' <= 26)
    16                 ways[l-2] = ways[l-1] + 1;
    17             else
    18                 ways[l-2] = ways[l-1];
    19         }
    20         for(i = l-3; i >= 0; i--){
    21             if(s[i] == '0'){
    22                 ways[i] = 0;
    23                 continue;
    24             }
    25             int tmp = (s[i]-'0')*10+s[i+1]-'0';
    26             if(tmp <= 26)
    27                 ways[i] = ways[i+1] + ways[i+2];
    28             else
    29                 ways[i] = ways[i+1];
    30         }
    31         return ways[0];
    32     }

     第二遍

     1     int numDecodings(string s) {
     2         // IMPORTANT: Please reset any member data you declared, as
     3         // the same Solution instance will be reused for each test case.
     4         int l = s.length();
     5         if(l == 0)
     6             return 0;
     7         if(l == 1)
     8             return s[0]>'0';
     9         int result[l+1];
    10         result[l-1] = s[l-1]>'0';
    11         result[l] = 1;
    12         for(int i = l-2; i >= 0; i--){
    13             if(s[i] == '0')
    14                 result[i] = 0;
    15             else{
    16                 int tmp = 10*(s[i]-'0')+s[i+1]-'0';
    17                 if(tmp <= 26)
    18                     result[i] = result[i+1]+result[i+2];
    19                 else
    20                     result[i] = result[i+1];
    21             }
    22         }
    23         return result[0];
    24     }
  • 相关阅读:
    一本通1621轻拍牛头
    2.23模拟赛
    一本通1618越狱
    P2280 [HNOI2003]激光炸弹
    P4513 小白逛公园
    P2165 [AHOI2009]飞行棋
    P1877 [HAOI2012]音量调节
    P2023 [AHOI2009]维护序列
    P2253 好一个一中腰鼓!
    P2434 [SDOI2005]区间
  • 原文地址:https://www.cnblogs.com/waruzhi/p/3447356.html
Copyright © 2011-2022 走看看