zoukankan      html  css  js  c++  java
  • LeetCode

    题目:

    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.

    思路:

    分情况讨论

    1. 当前字符为0

        1.1 前一个字符为0,3-9.

        1.2 前一个字符为1,2

    2. 当前字符非0

        2.1 前一个字符为0,3-9

        2.2 前一个字符为2,当前字符为7-9

        2.3 余下情况

    package dp;
    
    public class DecodeWays {
    
        public int numDecodings(String s) {
            int n;
            if (s == null || (n = s.length()) == 0) return 0;
            int[] dp = new int[n + 1];
            dp[0] = 1;
            if (s.charAt(0) == '0') return 0;
            dp[1] = 1;
            for (int i = 2; i <= n; ++i) {
                if (s.charAt(i - 1) == '0') {
                    if (s.charAt(i - 2) != '1' && s.charAt(i - 2) != '2') return 0;
                    dp[i] = dp[i - 2];
                } else if (s.charAt(i - 2) == '0' || s.charAt(i - 2) > '2' || 
                        (s.charAt(i - 2) == '2' && s.charAt(i - 1) > '6')) {
                    dp[i] = dp[i - 1];
                } else {
                    dp[i] = dp[i - 1] + dp[i - 2];
                }
            }
            return dp[n];
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            DecodeWays d = new DecodeWays();
            System.out.println(d.numDecodings("10") == 1);
            System.out.println(d.numDecodings("101") == 1);
            System.out.println(d.numDecodings("1001") == 0);
            System.out.println(d.numDecodings("10012") == 0);
            System.out.println(d.numDecodings("0012") == 0);
            System.out.println(d.numDecodings("12") == 2);
            System.out.println(d.numDecodings("128") == 2);
            System.out.println(d.numDecodings("27") == 1);
            System.out.println(d.numDecodings("99") == 1);
        }
    
    }

     更简化一下:

    package dp;
    
    public class DecodeWays {
    
        public int numDecodings(String s) {
            int n;
            if (s == null || (n = s.length()) == 0) return 0;
            int[] dp = new int[n + 1];
            dp[0] = 1;
            if (s.charAt(0) == '0') return 0;
            dp[1] = 1;
    
            for (int i = 2; i <= n; ++i) {
                int c1 = 0;
                if (s.charAt(i - 1) != '0')
                    c1 = dp[i - 1];
                int c2 = 0;
                if (s.charAt(i - 2) == '1' || (s.charAt(i - 2) == '2' && s.charAt(i - 1) < '7'))
                    c2 = dp[i - 2];
                dp[i] = c1 + c2;
            }
            
            return dp[n];
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            DecodeWays d = new DecodeWays();
            System.out.println(d.numDecodings("10") == 1);
            System.out.println(d.numDecodings("101") == 1);
            System.out.println(d.numDecodings("1001") == 0);
            System.out.println(d.numDecodings("10012") == 0);
            System.out.println(d.numDecodings("0012") == 0);
            System.out.println(d.numDecodings("12") == 2);
            System.out.println(d.numDecodings("128") == 2);
            System.out.println(d.numDecodings("27") == 1);
            System.out.println(d.numDecodings("99") == 1);
        }
    
    }
  • 相关阅读:
    asp读书笔记(二)内置对象
    网上收集的关于iframe的自适应高度代码js的
    第一遇到地震,虽然小点
    给网友写的控制页面元素高度的代码(js)
    给用户控件添加可枚举的属性
    标记(Tagging)能给网站带来的7大益处
    代码最重要的读者不再是编译器、解释器或者电脑,而是人!
    亚洲超大数据库会议(XLDB Asia 2012)
    每年15万美元!这是开发人员解决构造问题的总成本!
    华章IT图书书讯(2012年第7期)
  • 原文地址:https://www.cnblogs.com/null00/p/5098223.html
Copyright © 2011-2022 走看看