[letecode Java] Decode Ways

来源:互联网 发布:yy神曲下载软件 编辑:程序博客网 时间:2024/05/16 10:29

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.

一题编解码的问题,和爬楼梯很像,典型的动态规划问题,用数组来存储下标 i 对应的数量,不要用递归,一般都会超时。区别在于走两步产生“二位数”x是否可以解码,这里需要判断,如果x<27并且x>=10,则可以解码,否则不可以。(避免解码“04”之类的数)

设定一个s.length()+1的数组result[] ,从而使遍历从字符串下标1 (数组下标2)开始,相应的result[0]=1,result[1]=1。

这里,重点在于’0‘的判断,如果字符串下标(i-1)为'0',则若二位可解码,则result[i]=result[i-2];若不能(如“30”、“00”等),则break,即此字符串无法解码。如果不是’0‘,则二位可解码,result[i]=result[i-1]+result[i-2];否则result[i]=result[i-1]。

代码如下:

public class Solution {
    public int numDecodings(String s) {
        if(s==null||s.length()==0||s.charAt(0)=='0')
            return 0;


        int[] result=new int[s.length()+1];
        result[0]=1;
        result[1]=1;
        for(int i=2;i<=s.length();i++){
            if(s.charAt(i-1)=='0'){
                if(decodable(s,i-2,2))
                    result[i]=result[i-2];
                else
                    break;
            }
            else {
                if(decodable(s,i-2,2))
                    result[i]=result[i-2]+result[i-1];
                else
                    result[i]=result[i-1];
                
            }
        }
        return result[s.length()];
    }
    
    private boolean decodable(String s,int begin,int length){
        String str=s.substring(begin,begin+length);
        int temp=Integer.parseInt(str);
        if(temp<27&&temp>=10)
            return true;
        else
            return false;
    }
}

0 0
原创粉丝点击