leetcode 91.解码方法

原题

91.解码方法
在这里插入图片描述

题解

方法一 dp

我们在考虑字符串s从头到尾能代表多少种字母解码方式的时候,实际上是根据前多少位有多少种解码方式来计算的。
建立一个动态规划的数组ans,下标为i的那个表示的是,从头到s中的下表为i的那位一共能组成多少种解码。首先开头不能是0,这样的话不管一位一码还是两位一码都匹配不到字母,这时需要直接返回0;另外s长度为0也需要返回0;在考虑其他情况下的ans[i]的时候,需要先看一下i-1位置,两位置能不能组成10到26的数字
本方法java代码示例:

/*
@v7fgg
执行用时:3 ms, 在所有 Java 提交中击败了30.48%的用户
内存消耗:38.3 MB, 在所有 Java 提交中击败了7.69%的用户
2020年7月29日 11:05
*/
class Solution {
    public int numDecodings(String s) {
        if(s.length()==0||s.charAt(0)=='0'){return 0;}
        int[] ans=new int[s.length()];
        ans[0]=1;
        for(int i=1;i<s.length();i++){
            if(s.charAt(i)=='0'){
                if(s.charAt(i-1)>'2'||s.charAt(i-1)=='0'){return 0;}
                ans[i]=i==1?1:ans[i-2];
                continue;
            }
            int a=Integer.parseInt(s.substring(i-1,i+1));
            if(a>=10&&a<=26){
                ans[i]=i==1?2:ans[i-2]+ans[i-1];
            }
            else{
                ans[i]=ans[i-1];
            }
        }
        return ans[s.length()-1];
    }
}
//注意示例:0,10,30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可爱抱抱呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值