• 算法---解码方法(Kotlin)


    题目

    一条包含字母 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 = “0”
    输出:0
    解释:没有字符映射到以 0 开头的数字。
    含有 0 的有效映射是 ‘J’ -> “10” 和 ‘T’-> “20” 。
    由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。

    提示:

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

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/decode-ways
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解决思路

    在这里插入图片描述

    解决方法

        fun numDecodings(s: String): Int {
            val chars = s.toCharArray()
            val size = chars.size
            val dp = Array(size + 1) { 0 }
            dp[0] = 1
            for (i in 1..size) {
                val j = chars[i - 1] - '0'
                if (j != 0) {
                    dp[i] += dp[i - 1]
                }
    
                if (i - 2 >= 0) {
                    val k = chars[i - 2] - '0'
                    if (k != 0) {
                        val num = k * 10 + j
                        dp[i] += if (num <= 26) dp[i - 2] else 0
                    }
                }
            }
            return dp[size]
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
        fun numDecodings2(s: String): Int {
    
            val chars = " $s".toCharArray()
            val size = chars.size
            val dp = Array(size) { 0 }
            dp[0] = 1
            for (i in 1 until size) {
                //j 表示当前位   k表示前一位
                val j = chars[i] - '0'
                val k = chars[i - 1] - '0'
    
                if (j != 0) {
                    dp[i] += dp[i - 1]
                }
    
                val num = k * 10 + j
                dp[i] += if (num in 10..26) dp[i - 2] else 0
            }
            return dp[size - 1]
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    总结

    1.这个题也是动态规划的经典题
    当前的结果和上一个结果有很大的关系
    要么当前解码单独的一个 要么和前一个一块
    相对来说 会比较复杂
    但是思路足够清晰
    知道自己想要什么
    还是可以做出来的

    2.第二种方法是添加了一个空的字符串 用于解决-2的问题
    代码会相对优化一点 但是原理不变

  • 相关阅读:
    Java Matcher.find()方法具有什么功能呢?
    uniapp——项目day03
    有关Java发送邮件信息(支持附件、html文件模板发送)
    C语言基础例题7例-结构体篇
    WPF实时时间显示demo(MVVM)
    Linux常用命令(3)-文件和目录管理
    Dify后端源码目录结构和蓝图
    力扣第37题 解数独 c++ 难~ 回溯
    使用Visual Studio 2022 创建lib和dll并使用
    RetinaNet与点云聚类耦合的深度学习个体树分割方法研究
  • 原文地址:https://blog.csdn.net/u013270444/article/details/126097150