leetcode笔记—91编码方法

这篇博客探讨了LeetCode中的91题——解码方法,主要涉及动态规划的解决策略。博主分析了如何根据数字序列计算解码方法的数量,并提供了两种不同的Java代码实现,包括递归和迭代的方法。在代码解析中,博主强调了处理0和26的限制,以及如何通过维护一个动态数组来避免重复计算子问题。

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

题目:

一条包含字母 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) 。

思路:参考了网上大神的代码,原文链接如下:  https://blog.youkuaiyun.com/u012156116/article/details/79763005。

这个题是给出一组数字,判断共有多少种解码方案。整体上可以看做是动态规划。有些类似于上台阶有多少种解决方案。但这个题中有0和26的限制。以下代码的思路上先处理前两个字符。第一个字符如果是0的话解码方法就是0,;接着判断第二个字符,这部分只需判断第二个和第一个字符是否小于26.对于之后的各个字符,都有两种形式的解码方案,一是自己本身可以解码,另外是和前一个字符组合。如果字符本身为0,需要判断和前一个字符组合是否小于26,若满足,则dp[i]=dp[i]+dp[i-2];若不是0,除了与前一个字符组合外,还可以自己编码,即dp[i]=dp[i]+dp[i-1].(dp[i]表示第i位有多少解码方式)

 

这个是剑指46题。剑指中的思路采用从最小的子问题开始自下而上解决问题,这样可以消除重复的子问题。但是没有找到在leetcode中可以成功运行的相关代码。先把之前的代码看明白。以下两种代码都是上面那种思路。

我自己再一次写代码使用递归的思路写的,出现各种问题。。。。。

代码:

class Solution {
    public static int numDecodings(String s) {
        if(s.length()==0){
            return 0;
        }
        int[] dp = new int[s.length()];
        dp[0] = s.charAt(0)=='0'?0:1;
        if(s.length()==1){
            return dp[0];
        }
        int k = s.charAt(0) > '0' && s.charAt(1) > '0'? 1:0;
        dp[1] = k + (s.charAt(0) == '1' || s.charAt(0) == '2' && s.charAt(1) <= '6' ? 1:0);
        for (int i = 2; i < dp.length; i++) {
            if(s.charAt(i)!='0'){
                dp[i] += dp[i-1];
            }
            if(s.charAt(i-1)=='1'||s.charAt(i-1)=='2'&&s.charAt(i)<='6'){
                dp[i] += dp[i-2];
            }
        }
        return dp[s.length()-1];
    }

}

以下这个是leetcode中提交最多的代码:

这个和上面的代码是相同的思路,但是实现有些不同

class Solution {
    public int numDecodings(String s) {
        if(s==null||s.length()==0)
            return 0;
        int n=s.length();
        int[] dp=new int[n+1];
        dp[0]=1;
        dp[1]=s.charAt(0)=='0'?0:1;
        for(int i=2;i<=n;i++){
            if(s.charAt(i-1)!='0')
                dp[i]+=dp[i-1];
            if(s.charAt(i-2)=='1'||s.charAt(i-2)=='2'&&s.charAt(i-1)<='6')
                dp[i]+=dp[i-2];
        }
        return dp[n];
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值