博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode----91. Decode Ways
阅读量:4113 次
发布时间:2019-05-25

本文共 1647 字,大约阅读时间需要 5 分钟。

链接:

大意:

给定一个非空字符串s,s中的字符仅为'0'-'9'。定义一种加密规则:'A'->1,'B'->2,...,'Z'->26。要求出s有多少种解密方法。例子:

思路:

动态规划。

定义两个整型数组dan,shuang。dan[i] : 第i个数字单一解密时子串s0-si有多少种解密方法;shuang[i] : 第i个数字和第i - 1个数字组合解密时子串s0-si有多少种解密方法。

如果第i个数字仅能单一解密,即第i个数字和第i-1个数字的组合大于26,则dan[i] = dan[i - 1] + shuang[i - 1],shuang[i] = 0。

如果第i个数字仅能与第i-1个数字组合解密,即第i个数字为0且与第i-1个数字的组合为10或者20,则dan[i] = 0,shuang[i] = dan[i - 1]。此时有两种情况可以直接返回0:如果出现了连续的两个0(即第i - 1个数字也是0)或者与第i - 1个数字的组合大于26(即为30,40,50...)

如果第i个数字既能与第i-1个数字组合解密,也能单独解密。则dan[i] = dan[i - 1] + shuang[i - 1],shuang[i] = dan[i - 1]

以上的文字描述就是递推关系。

代码:

class Solution {    public int numDecodings(String s) {        char[] cs = s.toCharArray();        // dan[i]:第i个数字为单时有多少种可能 shuang[i]:第i个数字和第i-1个数字组合为双时有多少种可能        int[] dan = new int[cs.length], shuang = new int[cs.length];        int i = 1;        if (cs[0] == '0')            return 0;        dan[0] = 1;        shuang[0] = 0;        while (i < cs.length) {            if (cs[i] == '0') { // 第i个数字只能和第i-1个数字组合为双的情况                // 当出现连续的两个0或者第i-1个数字和第i个数字的组合大于26时直接返回0                if (cs[i - 1] == '0' || (cs[i - 1] - '0') * 10 + (cs[i] - '0') > 26)                     return 0;                dan[i] = 0;                shuang[i] = dan[i - 1];            } else if ((cs[i - 1] - '0') * 10 + (cs[i] - '0') > 26){ // 第i个数字只能为单的情况                dan[i] = dan[i - 1] + shuang[i - 1];                shuang[i] = 0;            } else { // 第i个数字既可以为单也可以和第i-1个数字为双                dan[i] = dan[i - 1] + shuang[i - 1];                shuang[i] = dan[i - 1];            }            i++;        }        return dan[cs.length - 1] + shuang[cs.length - 1];    }}

结果:

结论:

很巧妙的一个动归题,说到底还是找递推关系。 

 

 

转载地址:http://ptesi.baihongyu.com/

你可能感兴趣的文章
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>
论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
查看>>
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
Day_15JavaSE 异常
查看>>
异常 Java学习Day_15
查看>>
JavaSE_day_03 方法
查看>>
day-03JavaSE_循环
查看>>
Mysql初始化的命令
查看>>