Leetcode 91 题 解码方法

本文介绍了LeetCode第91题的解题思路和Java实现。通过对给定数字字符串进行解码,计算所有可能的解码方法总数。采用动态规划方法,通过分析不同长度的子串解码方式来得出答案。具体解题过程中,考虑了数字组合超过26以及0不能单独作为字符的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源:https://leetcode-cn.com/problems/decode-ways/
个人公众号:小猿君的算法笔记

题目描述

一条包含字母 A-Z 的消息通过以下方式进行了编码:
‘A’ -> 1,‘B’ -> 2,…,‘Z’ -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。

示例 1:
输入:s = “12”
输出:2
解释:它可以解码为 “AB”(1 2)或者 “L”(12)。

提示:
1 <= s.length <= 100
s 只包含数字,并且可能包含前导零。

思路分析

这道题要求我们对给定的字符串进行解码,并获取解码方式总和。这里进行举例说明解题方式,假设s = “1122”。我们首先取出最后一个2,看有几种情况。很明显,只有一种情况B。
在这里插入图片描述
如果我们取后两位22进行解码,共有两种情况,BB或V。
在这里插入图片描述
我们继续增加一位变成122,增加的这个1可以单独作为A使用,也可以和其后的2组合,作为L使用。如果单独使用,那么解码数取决于22的解码数,即A BB或A V。如果和后面的2合并作为L使用,那么解码数取决于最后一位2的解码数,即L V。也就是说,122一共有三种解码方式。
在这里插入图片描述
再增加一位变为1122,新增的这个1可以单独作为A使用,也可以和第二位的1组合,作为K使用。如果单独使用,那么解码方式取决于122的解码方式,即A ABB或A AV或A LV。如果和后面的1合并作为K使用,那么解码方式取决于22的解码方式,即K BB或K V。因此,1122共有五种解码方式。

通过以上分析,我们可以看出,当前位N的解码方法总数,取决于N+1位长度时的解码方式总数与N+2长度时的解码方式总数的和,即dp[n] = dp[n + 1] + dp[n + 2]。

「约束条件」
如果再新增的一位0时,即01122,事实上对于这串数,我们是无法进行解码的,解码方式为0,即dp[n] = 0。

如果新增一位数使得其与后一位的组合超过了26,那么新增的这一位只能单独使用,即dp[n] = dp[n + 1]。

代码描述
class Solution {
    public int numDecodings(String s) {
        int len = s.length();

        int[] dp = new int[len + 1];
        dp[len] = 1; // 最末尾赋值为1,方便处理

        if (s.charAt(len - 1) != '0') { // 计算最后一位解码数量
            dp[len - 1] = 1;
        }

        for (int i = len - 2; i >= 0; i--) {
            if (s.charAt(i) == '0') {
                continue;
            }
            int sum = (s.charAt(i) - '0') * 10 + s.charAt(i + 1) - '0';
            if (sum <= 26) {
                dp[i] = dp[i + 1] + dp[i + 2];
            } else {
                dp[i] = dp[i + 1];
            }
        }

        return dp[0];
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值