首页 > 其他 > 详细

lintcode-medium-Decode Ways

时间:2016-03-18 13:16:10      阅读:140      评论:0      收藏:0      [点我收藏+]

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.

Given encoded message 12, it could be decoded as AB (1 2) or L(12).
The number of ways decoding 12 is 2.

 

思路:

动态规划,用一个int数组表示0~i个字符组成的字符串解码方法总数

状态转移分3种情况:

1. 第i个字符有效,第i - 1个和第i个字符组成的字符串也有效,count[i] = count[i - 1] + count[i - 2];

2. 第i个字符有效,第i - 1个和第i个字符组成的字符串无效,count[i] = count[i - 1]

3. 第i个字符无效,第i - 1个和第i个字符组成的字符串有效,count[i] = count[i - 2];

4. 都无效,返回0

public class Solution {
    /**
     * @param s a string,  encoded message
     * @return an integer, the number of ways decoding
     */
    public int numDecodings(String s) {
        // Write your code here
        
        if(s == null || s.length() == 0)
            return 0;
        
        if(s.length() == 1){
            if(isValid(s))
                return 1;
            else
                return 0;
        }
        
        int length = s.length();
        int[] count = new int[length];
        
        if(isValid(s.substring(0, 1)))
            count[0] = 1;
        else
            return 0;
        
        if(isValid(s.substring(0, 2)) && isValid(s.substring(1, 2)))
            count[1] = 2;
        else if(!isValid(s.substring(0, 2)) && isValid(s.substring(1, 2)))
            count[1] = 1;
        else if(isValid(s.substring(0, 2)) && !isValid(s.substring(1, 2)))
            count[1] = 1;
        else    
            return 0;
        
        for(int i = 2; i < length; i++){
            boolean flag1 = isValid(s.substring(i - 1, i + 1));
            boolean flag2 = isValid(s.substring(i, i + 1));
            
            if(flag1 && flag2)
                count[i] = count[i - 1] + count[i - 2];
            else if(!flag1 && flag2)
                count[i] = count[i - 1];
            else if(flag1 && !flag2)
                count[i] = count[i - 2];
            else    
                return 0;
        }
        
        return count[length - 1];
    }
    
    public boolean isValid(String s){
        if(s.charAt(0) == ‘0‘)
            return false;
        
        int num = Integer.parseInt(s);
        if(num <= 26)
            return true;
        else
            return false;
    }
    
}

 

lintcode-medium-Decode Ways

原文:http://www.cnblogs.com/goblinengineer/p/5291593.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!