【Java】解码方法

题目描述

一条包含字母 A-Z 的消息通过以下方式进行了编码:

'A' -> 1
'B' -> 2
...
'Z' -> 26

给定一个只包含数字的非空字符串,请计算解码方法的总数。

示例 1:

输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。

示例 2:

输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

 具体解法就是动态规划,看注释吧,判断情况都说明了

class Solution {
    public int numDecodings(String s) {
        //以0开头的字符串,0是非法字符,只有在“10”,“20”这两种情况下出现才合法,这里直接0打头,摊牌了,没法玩了
        if(s.charAt(0)=='0') {
            return 0;
        }
        int[] dp=new int[s.length()];
        //单独一个不是0的数字(1~9)必合法
        dp[0]=1;
        // 从第二个数字开始遍历
        for(int i=1;i<s.length();i++){
            //当前数字为‘0’
            if(s.charAt(i)=='0'){
                //连续两个0,整个字符串非法,没法解
                if(s.charAt(i-1)=='0') {
                    return 0;
                } else{
                    if(s.charAt(i-1)>'2') {
                        //0前头不是1,也不是2,非法组合(既不能和前一个合并,也不能单独拿出来)
                        return 0;
                    } else {
                        //“10”或者“20”的情况,只能把10,20绑定在一起解码
                        // 判断i-2是否存在
                        dp[i]=i-2 < 0 ?1:dp[i-2];
                    }
                }
                //当前数字不为0
            }else{
                if(s.charAt(i-1)=='0') {
                    //如“1309”,指到9时,9不能和前面的0组合,0只能和1绑定在一起,所以还是1种解码方法
                    dp[i]=dp[i-1];
                    //前面数字也不是0
                } else{
                    //判断是否是1-26
                    if(Integer.parseInt(s.substring(i-1,i+1))<=26) {
                        dp[i]=(i-2)<0?2:(dp[i-1]+dp[i-2]);
                    } else {
                        //大于26的情况,只有1种解法,当前数字只能单独拿出来
                        dp[i]=dp[i-1];
                    }
                }
            }
        }
        return dp[s.length()-1];
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值