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.

     1 public class Solution {
     2     public int numDecodings(String s) {
     3        int num = 0;
     4         if(s.length() > 0){
     5             int[] decodeways  = new int[s.length()];
     6             if(Integer.parseInt(s.substring(0, 1)) == 0)
     7                 return 0;
     8             else
     9                 decodeways[0] = 1;            
    10             if(s.length()> 1){
    11                 if(Integer.parseInt(s.substring(1, 2)) != 0){
    12                     if(Integer.parseInt(s.substring(0, 2)) > 26)
    13                         decodeways[1] = 1;
    14                     else{
    15                         if(Integer.parseInt(s.substring(0, 1)) == 0)
    16                             return 0;
    17                         else
    18                             decodeways[1] = 2;                            
    19                     }                
    20                 }                
    21                 else{
    22                     if(Integer.parseInt(s.substring(0, 1)) > 2)
    23                         return 0;
    24                     else
    25                         decodeways[1] = 1;                        
    26                 }
    27                 for(int i = 2; i < s.length(); ++i){
    28                     if(Integer.parseInt(s.substring(i, i + 1)) != 0){
    29                         if(Integer.parseInt(s.substring(i - 1, i + 1)) > 26 || 
    30                             Integer.parseInt(s.substring(i - 1, i)) == 0)
    31                             decodeways[i] = decodeways[i - 1];
    32                         else
    33                             decodeways[i] = decodeways[i - 1] + decodeways[i - 2];
    34                     }
    35                     else{
    36                         if(Integer.parseInt(s.substring(i - 1, i)) == 0 || 
    37                             Integer.parseInt(s.substring(i - 1, i)) > 2){
    38                             num = 0;
    39                             break;
    40                         }
    41                         else
    42                             decodeways[i] = decodeways[i - 2];
    43                     }                    
    44                 }
    45             }
    46             num = decodeways[s.length() - 1];
    47         }
    48         return num;    
    49     }
    50 }

    code 2, the same algorithm as above

     1 public class Solution {
     2     public int numDecodings(String s) {
     3       int num = 0;
     4         if(s.length() == 0 || s.charAt(0) == '0')
     5             return num;
     6           else{
     7             int[] ways = new int[s.length() + 1];
     8             ways[0] = ways[1] = 1;
     9             for(int i = 2; i < s.length() + 1; ++i){
    10                 int cur = Integer.parseInt(s.substring(i - 1, i));
    11                 int pre = Integer.parseInt(s.substring(i - 2, i - 1));
    12                 if(cur != 0){
    13                     if(pre != 0){
    14                         ways[i] = (Integer.parseInt(s.substring(i - 2, i)) < 27) ? ways[i - 1] + ways[i - 2] : ways[i - 1];
    15                     }
    16                     else
    17                         ways[i] = ways[i - 2];                        
    18                 }
    19                 else{
    20                     if(pre > 2 || pre == 0)
    21                         return num;
    22                     else
    23                         ways[i] = ways[i - 2];
    24                 }    
    25             }
    26             num = ways[s.length()];    
    27         }
    28         return num;
    29     }
    30 }

    The third code:

    public class Solution {
        public int numDecodings(String s) {
           int result = 0;
    		int length = s.length();
    		if(length > 0){
    			int[] ways = new int[length + 1];
    			ways[length] = 1;
    			ways[length - 1] = (s.charAt(length - 1) - '0' == 0) ? 0 : 1;
    			for(int i = length - 2; i > -1; --i){
    				if(s.charAt(i)-'0' == 0)
    					ways[i] = 0;
    				else if((s.charAt(i) - '0' == 1)){
    					if(s.charAt(i + 1) - '0' == 0)
    						ways[i] = ways[i + 2];
    					else
    						ways[i] = ways[i + 2] + ways[i + 1];
    				}
    				else if(s.charAt(i) -'0' == 2){
    					if(s.charAt(i + 1) - '0' == 0)
    						ways[i] = ways[i + 2];
    					else if(s.charAt(i + 1) - '0' != 0 && s.charAt(i + 1) - '0' < 7)
    						ways[i] = ways[i + 1] + ways[i + 2];
    					else
    						ways[i] = ways[i + 1];					
    				}
    				else{
    					if(s.charAt(i + 1) - '0' == 0)
    						ways[i] = 0;
    					else
    						ways[i] = ways[i + 1];
    				}
    			}
    			result = ways[0];
    		}
    		return result;
        }
    }
    

      

  • 相关阅读:
    LFU
    poj 3581 -- 后缀数组
    leetcode 679
    poj 两条线段接雨水
    poj 1696极角排序
    判断平面上是否有一条直线与所有线段相交
    洛谷P3808 【模板】AC自动机(简单版)
    Most Distant Point from the Sea UVA
    P2742 [USACO5.1]圈奶牛Fencing the Cows /【模板】二维凸包
    P2249
  • 原文地址:https://www.cnblogs.com/averillzheng/p/3536707.html
Copyright © 2011-2022 走看看