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     }
  • 相关阅读:
    c++ struct 使用
    c++数组、字符串操作
    c++ List、Vector、Stack、Queue使用
    十三、哈希表
    十二、234树
    十一、红黑树
    十、哈夫曼编码
    九、二叉树
    八、高级排序
    七、递归
  • 原文地址:https://www.cnblogs.com/waruzhi/p/3447356.html
Copyright © 2011-2022 走看看