leetcode-91

题目

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :

'A' -> 1
'B' -> 2
...
'Z' -> 26

要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:

“AAJF” ,将消息分组为 (1 1 10 6)
“KJF” ,将消息分组为 (11 10 6)
注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06” 在映射中并不等价。

给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。

题目数据保证答案肯定是一个 32 位 的整数。

核心

爬楼梯,可以一步,可以两步,请问…

本质上来说,两个东西不都一样么。不过多了点限制

  • 不能以0开头
  • 两位数值不能大于26

追根究底,还是逃不过 f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n) = f(n-1) + f(n-2) f(n)=f(n1)+f(n2),不过,两部分是存在特殊条件的。

f ( n − 1 ) f(n-1) f(n1)

至少不能是0,所以正确结果是
f ( n − 1 ) = { 0 c [ n − 1 ] = ’0’ f ( n − 2 ) + f ( n − 3 ) otherwise f(n-1) = \left\{\begin{matrix} 0 & c[n-1] = \text{'0'} \\ f(n-2) + f(n-3) & \text{otherwise} \end{matrix}\right. f(n1)={0f(n2)+f(n3)c[n1]=’0’otherwise

f ( n − 2 ) f(n-2) f(n2)

f ( n − 2 ) = { f ( n − 3 ) + f ( n − 4 ) 10 ≤ int(c[n-3],c[n-3]) ≤ 26 0 otherwise f(n-2) = \left\{\begin{matrix} f(n-3) + f(n-4) & 10 \le \text{int(c[n-3],c[n-3])} \le 26 \\ 0 &\text{otherwise} \end{matrix}\right. f(n2)={f(n3)+f(n4)010int(c[n-3],c[n-3])26otherwise

解答

缓存

class Solution {
    public int numDecodings(String s) {
        int length = s.length();
        int[] result = new int[length + 1];
        result[0] = 1;
        char lastChar;
        char lastBefore;
        for (int i = 1; i < length+1; i++) {
            if((lastChar = s.charAt(i - 1)) != '0'){
                result[i] += result[i-1];
            }
            if(i > 1 && (lastBefore = s.charAt(i-2)) != '0' && (10 * (lastBefore - '0') + (lastChar - '0')) <= 26){
                result[i] += result[i-2];
            }
        }
        return result[length];
    }
}

累计

斐波那契本来就能够从小累大,这个同样可以。

class Solution {
    public int numDecodings(String s) {
        int length = s.length();
        int lastBefore = 0;
        int last = 1;
        int current = 0;
        for (int i = 1; i < length+1; i++) {
            current = 0;
            if(s.charAt(i - 1) != '0'){
                current += last;
            }
            if(i > 1 && s.charAt(i-2) != '0' && (10 * (s.charAt(i-2) - '0') + (s.charAt(i-1) - '0')) <= 26){
                current += lastBefore;
            }
            lastBefore = last;
            last = current;
        }
        return current;
    }
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值