LeetCode 91. Decode Ways

问题描述

这里写图片描述

问题分析

  • 将给定数字字符串译码成字母字符串,看能有多少种译码情况
  • LeetCode 62. Unique Paths 类似,是统计可能性情况个数类型的题目先从递归入手,然后想动态规划。
  • 译码情况的问题,要注意,当前可能译一个,也可能译两个,也可能遇到‘0’,直接译码失败,这些都要考虑。

代码实现

  • 递归(TLE)
    public int numDecodings(String s) {
        if (s == null ) {
            return 0;
        }
        char[] chs = s.toCharArray();
        return getNum(chs, 0);
    }

    public int getNum(char[] chs, int begin) {
        if (begin == chs.length) {
            return 1;
        }
        if (chs[begin] == '0') {
            return 0;
        }
        int res = 0;
        res += getNum(chs, begin + 1);
        if (begin + 1 < chs.length && (chs[begin] - '0') * 10 + chs[begin + 1] - '0' <= 26) {
            res += getNum(chs, begin + 2);
        }
        return res;
    }
  • 动态规划
    public int numDecodings(String s) {
       if (s == null ) {
            return 0;
        }
        char[] chs = s.toCharArray();
        int[] dp = new int[chs.length + 1];
        //dp[i]表示从i个字符起,能解码出几种情况
        dp[chs.length] = 1;
        for (int i = chs.length - 1; i >= 0; --i) {
            //对于dp[i]
            if (chs[i] == '0') {//该位置为0,无法后序译码,为0
                dp[i] = 0;
                continue;
            }
            //译chs[i]
            dp[i] = dp[i + 1];
            //看能否译 chs[i ~ i+1]
            if (i + 1 < chs.length && (chs[i] - '0') * 10 + chs[i + 1] - '0' <= 26) {
                dp[i] += dp[i + 2];
            }
        }
        return dp[0];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值