题目

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-ways

思路

这个题有点像爬楼梯,但是比爬楼梯复杂很多。有很多限制条件,甚至题目没给出来,比如不能以0开头,不能连续出现两个0。 总之分解之后的数值只能在[1,26]之间。

先用递归的思想,自顶向下的思考问题。这里的“顶”是指字符串最后一个字符。

如果连续两个数字符合条件([1,26],如果像09这种,就不是两个数字符合条件,因为拆分成两个的话,会出现0和9, 0不符合条件。简单的方式是看这两个字符形成的数字是不是在[10,26]之间。其中10在这之前被考虑过。),

则有两种解法,一种是分成两个数字,还有一种是整个解成一个数字。

考虑限制条件比较麻烦,以下有先后顺序:

  1. 不能以0开头
  2. 不能出现连续两个0
  3. 如果当前数字不是0,则可以先将两个数字拆开解(解法1)
  4. 如果连续两个数字符合条件,则将两个数字一起解(解法2)
  5. 其他大于26的情况,只能拆开解,已经在第3步考虑过了

代码

递归

class Solution(object):def num(self,s, i):# 不能以0开头if int(s[0]) == 0:return 0if i <= 0:  # <是有必要的return 1# 不能出现两个0if i >= 1 and int(s[i] + s[i - 1]) == 0:return 0res = 0# 当前数字不是0if int(s[i]) != 0:# 先拆分一步res = self.num(s, i - 1)digit = int(s[i - 1] + s[i])# 如果连续的两位数符合条件,有两种解法if 10 <= digit <= 26:res += self.num(s, i - 2)return resdef numDecodings(self, s):""":type s: str:rtype: int"""return self.num(s, len(s) - 1)

记忆化搜索

记忆化搜索也很简单,将计算结果保存起来即可。

dp = {0: 1}class Solution(object):def num(self, s, i):if i not in dp:if i <= 0:  # <是有必要的dp[i] = 1return 1# 不能出现两个0if i >= 1 and int(s[i] + s[i - 1]) == 0:dp[i] = 0return 0res = 0# 当前数字不是0if int(s[i]) != 0:# 则可以拆分连续的两个res = self.num(s, i - 1)digit = int(s[i - 1] + s[i])# 如果连续的两位数符合条件if 10 <= digit <= 26:# 可以把连续的两个作为一起res += self.num(s, i - 2)dp[i] = resreturn dp[i]def numDecodings(self, s):""":type s: str:rtype: int"""# 不能以0开头if int(s[0]) == 0:return 0return self.num(s, len(s) - 1)


但是不知道为啥,网站说跑不过测试用例"10",说我输出为2,我手动将测试用例改成"10"输出明明是1:


纠结了一会,不管它。改成动态规划看能过不。

动态规划

采用动态规划自底向上的解决问题,也就是从字符串第一个字符开始考虑。

class Solution:def numDecodings(self, s: str) -> int:n = len(s)if s[0] == '0':return 0dp = [1] + [0] * n# 用i+1替换为i,不然容易数组越界# i 从[0,n-1]for i in range(0,n):# 不能出现两个0if i >= 1 and int(s[i] + s[i - 1]) == 0:return 0# 当前数字不是0if int(s[i]) != 0:dp[i+1] = dp[i] # 解法1if i >= 1 and 10 <= int(s[i - 1] + s[i]) <= 26:dp[i+1] += dp[i-1] # 解法2return dp[n]

这里要注意一点的是,本来如果有两个解法是写成dp[i] = dp[i-1]+dp[i-2],但是容易数组越界,要考虑的情况很多,不信可以试下。

因此这里令i = i + 1,问题就好处理了,但是处理s时还是一样的。


被我刷到了28ms ^v^

LeetCode刷题——91. 解码方法相关推荐

  1. LeetCode 90子集Ⅱ91解码方法

    微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...

  2. leetcode刷题方法

    leetcode刷题方法 一.范围内的200题 二.刷题步骤 三.算法思路 四.更新 1.12日留 此文章借鉴 陈同学在搬砖 微信公众号的一篇文章: https://mp.weixin.qq.com/ ...

  3. Leetcode-D26-动态规划(二刷)-413. 等差数列划分91. 解码方法

    昨天电脑在跑东西,卡的不行,用ipad写的题,没在csdn上写 413. 等差数列划分 1.有些思路了,写下看看. class Solution:def numberOfArithmeticSlice ...

  4. LeetCode 91.解码方法

    LeetCode 91.解码方法 ways: s[i] = 0 : if(s[i-1] == 1 || s[i-1] == 2) :s[i]只能和前一位绑定在一起,此时dp[i] = dp[i-2]; ...

  5. leetcode: 91. 解码方法

    91. 解码方法 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/decode-ways/ 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : ...

  6. C刷题:一个方法团灭LeetCode股票买卖问题

    C刷题:一个方法团灭LeetCode股票买卖问题 核心框架 5道题中的易错点 买卖股票的最佳时机 买卖股票的最佳时机 II 买卖股票的最佳时机 III 最佳买卖股票时机含冷冻期(中等) 买卖股票的最佳 ...

  7. Java实现 LeetCode 91 解码方法

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

  8. C#LeetCode刷题-动态规划

    动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串 22.4% 中等 10 正则表达式匹配 18.8% 困难 32 最长有效括号 23.3% 困难 44 通配符匹配 17.7% 困难 53 最 ...

  9. C#LeetCode刷题-字符串

    字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.6% 中等 5 最长回文子串 22.4% 中等 6 Z字形变换 35.8% 中等 8 字符串转整数 (atoi) 15.3% 中 ...

  10. leetcode刷题目录总结

    题目 题目 技巧 相似的题目 其他 1. 无序数组中找出目标为target的两个数 先定义下一个数,然后找两位的数是否存在 高频, 大厂刷题班, 第27节 2.逆序链表两数相加 链表.各位加法 高频, ...

最新文章

  1. Linux系统捕获数据包流程
  2. 015_请求转发和重定向
  3. Linux常用指令收集
  4. 恶意npm包收集用户IP等信息并在GitHub传播
  5. C#计算两个时间的差
  6. 基于ZooKeeper的Dubbo注册中心【转】
  7. 二级计算机excel以宏保存,Excel宏保存
  8. 计算机信息技术为教育带来的变化,信息技术对课堂教学带来的变化
  9. 电脑时钟倒计时_倒计时久坐休息提醒工具
  10. 【tips】编译epic异常解决
  11. 自学篇之----html的所有input标签 以及post和get提交之间的区别
  12. 各地特色美食与点菜的艺术
  13. CentOS 7安装配置FTP服务器
  14. python类:magic魔术方法
  15. Mac 如何安装 Mysql@5.7
  16. WindowsBuilder安装使用
  17. 思科模拟器路由表怎么看_思科路由器查看配置命令
  18. 2015/7/22 成交量怀疑 会不会是在吸引上方的套牢盘割肉呢
  19. stc15f2k60s2.h
  20. python中的subprocess.Popen()使用

热门文章

  1. C语言判断文件编码格式
  2. 【转】eclipse 查看原始类出现The jar file rt.jar has no source attachment解决方法
  3. 从研发角度谈存储技术的学习
  4. C++类引用中的构造函数与析构函数的执行顺序练习
  5. HTTP协议-GET/POST请求
  6. 如何自动生成和安装requirements.txt依赖
  7. [转]常见hash算法的原理
  8. asp.net 多文件上传,兼容IE6/7/8,提供完整代码下载
  9. 《htmlxhtml权威指南》部分标签语义学习
  10. JavaScript案例精解(一)