[letecode Java] 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.

一题编解码的问题,和爬楼梯很像,典型的动态规划问题,用数组来存储下标 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值