leetcode-解码方法(计数dp)

在这里插入图片描述


思路:
● 动态规划 的第一步即为 确定状态,记dp[i] 为到第i+1位时的解码方法总数
● 最后一步 : 最后通过递推即可得到dp[s.length()] 即为结果
● 边界处理: 初始化dp[0]=1,dp[1] 可由dp[0]推导

注意:

  1. 此题求解的是解码的方法数,当我们到i位时,如果是直接解码当前i位的数作为1次解码的方法时,实际上和之前的解码方式等价,无需再对解码总数加一
  2. 注意处理前面为前导零的情况
class Solution {

    public int numDecodings(String s) {
         int[] dp=new int[s.length()+1];
         /**
         dp[i] 表示到第i个时解码的种数,注意单个解码的方式,视为1种
          */
          dp[0]=1;// 初始化为1
         for(int i=1;i<=s.length();i++){
             if(s.charAt(i-1)!='0'){
                 dp[i]=dp[i-1];// 当前数不为0,相当于和之前的解码数一样,因为每次解码一次的方法是相同的
             }
             // 和前一个组合会使得当前数增加,组合的数小于26增加
             if(i>1&&(s.charAt(i-2)-'0'>0&&((s.charAt(i-1)-'0')+(s.charAt(i-2)-'0')*10)<=26  )){
                 dp[i]+=dp[i-2];//加上截至到前两次的方法,注意无需加一,和截至前两次的的个数相同
             }
         }
         return dp[s.length()];
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值