当前位置: 首页 > news >正文

算法leetcode|91. 解码方法(rust重拳出击)


文章目录

  • 91. 解码方法:
    • 样例 1:
    • 样例 2:
    • 样例 3:
    • 提示:
  • 分析:
  • 题解:
    • rust:
    • go:
    • c++:
    • python:
    • java:


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 位 的整数。

样例 1:

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

样例 2:

输入:s = "226"输出:3解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

样例 3:

输入:s = "06"输出:0解释:"06" 无法映射到 "F" ,因为存在前导零("6" 和 "06" 并不等价)。

提示:

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

分析:

  • 面对这道算法题目,二当家的再次陷入了沉思。
  • 首先需要分析注意几个点,合法的解码数字范围是 1 到 26 ,所以 0 一定出现在个位,最重要的就是类似于 12 这种,可以解码为一个字母 “L” ,也可以解码为两个字母 “AB” 。
  • 当一个数字不是 0 或者说是 [1,9] 时,可以解析为 [A,I]
  • 当一个数字和前一个数字可以组成一个两位数,并且范围是 [10,26] 时,可以解析为 [J,Z] ,就多出一种解码方式。
  • 由于结果依赖于前面的解码情况,可以用动态规划,但是并不需要存储 n 个结果,因为每个解码数量 fi​ 的值仅与 fi−1​ 和 fi−2​ 有关,所以可以仅用三个变量,滚动存储临时结果。
  • 要特别注意前导0是无效的。

题解:

rust:

impl Solution {pub fn num_decodings(s: String) -> i32 {let n = s.len();// a = dp[i-2], b = dp[i-1], c=dp[i]let (mut a, mut b, mut c) = (0, 1, 0);(1..=n).for_each(|i| {c = 0;if s.as_bytes()[i - 1] != b'0' {c += b;}if i > 1 && s.as_bytes()[i - 2] != b'0' && ((s.as_bytes()[i - 2] - b'0') * 10 + (s.as_bytes()[i - 1] - b'0') <= 26) {c += a;}a = b;b = c;});return c;}
}

go:

func numDecodings(s string) int {n := len(s)// a = dp[i-2], b = dp[i-1], c = dp[i]a, b, c := 0, 1, 0for i := 1; i <= n; i++ {c = 0if s[i-1] != '0' {c += b}if i > 1 && s[i-2] != '0' && ((s[i-2]-'0')*10+(s[i-1]-'0') <= 26) {c += a}a, b = b, c}return c
}

c++:

class Solution {
public:int numDecodings(string s) {const int n = s.size();// a = dp[i-2], b = dp[i-1], c = dp[i]int a = 0, b = 1, c = 0;for (int i = 1; i <= n; ++i) {c = 0;if (s[i - 1] != '0') {c += b;}if (i > 1 && s[i - 2] != '0' && ((s[i - 2] - '0') * 10 + (s[i - 1] - '0') <= 26)) {c += a;}tie(a, b) = {b, c};}return c;}
};

python:

class Solution:def numDecodings(self, s: str) -> int:n = len(s)# a = dp[i-2], b = dp[i-1], c = dp[i]a, b, c = 0, 1, 0for i in range(1, n + 1):c = 0if s[i - 1] != '0':c += bif i > 1 and s[i - 2] != '0' and int(s[i - 2:i]) <= 26:c += aa, b = b, creturn c

java:

class Solution {public int numDecodings(String s) {final int n = s.length();// a = dp[i-2], b = dp[i-1], c=dp[i]int a = 0, b = 1, c = 0;for (int i = 1; i <= n; ++i) {c = 0;if (s.charAt(i - 1) != '0') {c += b;}if (i > 1 && s.charAt(i - 2) != '0' && ((s.charAt(i - 2) - '0') * 10 + (s.charAt(i - 1) - '0') <= 26)) {c += a;}a = b;b = c;}return c;}
}

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】三连走一波~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


http://www.lryc.cn/news/252053.html

相关文章:

  • zabbix配置snmp trap--使用snmptrapd和Bash接收器(缺zabbix_trap_handler.sh文中自取)--图文教程
  • vue: 线上项目element-ui的icon偶尔乱码问题
  • fpga rom 初始化文件的一些心得
  • 从零构建属于自己的GPT系列3:模型训练2(训练函数解读、模型训练函数解读、代码逐行解读)
  • Python词频统计(数据整理)
  • 基本面选股的方法
  • 应用密码学期末复习(3)
  • PAD平板签约投屏-高端活动的选择
  • 分布式架构demo
  • TA-Lib学习研究笔记(二)——Overlap Studies上
  • 牛客java基础考点1 标识符和变量
  • Qt将打印信息输出到文件
  • 【risc-v】易灵思efinix FPGA sapphire_soc IP配置参数分享
  • 直播的种类及类型
  • 时间序列数据压缩算法简述
  • 智能锁-SI522TORC522方案资料
  • redux(4) -RTK简单使用
  • 开源运维监控系统-Nightingale(夜莺)应用实践(未完)
  • 深入理解GMP模型
  • 数学建模-基于集成学习的共享单车异常检测的研究
  • C语言-内存分配
  • 算法工程师-机器学习面试题总结(1)
  • 【蓝桥杯选拔赛真题73】Scratch烟花特效 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析
  • Juniper EX系列交换机端口配置操作
  • 2.1 Linux C 编程
  • 服务器数据恢复—ocfs2文件系统被格式化为其他文件系统如何恢复数据?
  • 海云安参与制定《信息安全技术 移动互联网应用程序(App)软件开发工具包(SDK)安全要求》标准正式发布
  • 如何调用 API | 学习笔记
  • 关于云备份项目的HTTP协议字段理解
  • 掉落的俄罗斯方块