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

    题目含义:给你一串数字,解码成英文字母

    分析

    如果string中没有‘0’的存在,这道题就是简单的爬楼梯问题70. Climbing Stairs  并且其动归方程可以简单的记为:dp(i+1)=dp(i)+dp(i-1)

    现在分析连续出现的两位数int tmp那么它存在以下几种情况: 

    情况一 
    10 <= tmp <= 26 这个时候一定满足一个条件,dp(i)至少包含了dp(i-2)的内容,例如当子串为xxxx26,则一定能完成编码xxxxZ,而xxxx编码的个数为dp(i-2)。也就是说,从d[i-2]再跳一步(两位数26作为一个编码Z)可到达dp[i], 即dp[i] = dp[i] + dp[i-2]

    情况二 

    1 <= tmp <= 9 ,例如当子串为xxxx26,则一定能完成编码xxxxBF,而xxxxB编码的个数为dp(i-1)。也就是说,从从d[i-1]再跳一步(单个位数6作为一个编码F)可到达dp[i], 即dp[i] = dp[i] + dp[i-1]

     1     public int numDecodings(String s) {
     2         if(s == null || s.length() == 0 || s.charAt(0) == '0') {
     3             return 0;
     4         }
     5         int n = s.length();
     6         int[] dp = new int[n+1];
     7         dp[0] = 1;
     8         dp[1] = 1;
     9         for(int i = 2; i <= n; i++) {
    10             int first = Integer.valueOf(s.substring(i-1, i));
    11             int second = Integer.valueOf(s.substring(i-2, i));
    12             if(first >= 1 && first <= 9) {
    13                 dp[i] += dp[i-1];
    14             }
    15             if(second >= 10 && second <= 26) {
    16                 dp[i] += dp[i-2];
    17             }
    18         }
    19         return dp[n];        
    20     }
  • 相关阅读:
    CountDownLatch, CyclicBarrier, Semaphore
    工具类中使用@Autowired失败问题
    可重入锁(递归锁)
    读写锁
    自旋锁
    加入BLOG
    控制字符串的超长部分用省略号表示
    java常见面试题总结
    maven打包不运行test脚本的命令
    DataGrip使用教程
  • 原文地址:https://www.cnblogs.com/wzj4858/p/7685353.html
Copyright © 2011-2022 走看看