• leetcode91-解码方法


    题目描述

    见网址

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

    思路1

    一开始使用dfs,出现超时,代码如下:

    class Solution(object): # dfs超时
        def numDecodings(self, s): # 111111111111111111111111111111111111111111111
            """
            :type s: str
            :rtype: int
            """
            self.res = 0
    
            def dfs(cur):
                if cur == len(s):
                    self.res+=1
                else:
                    if s[cur]=='0':
                        return
                    if cur!=len(s)-1 and int(s[cur:cur+2])<=26: # 如果不是最后一个数字
                        dfs(cur+2)
                    dfs(cur+1)
            
            dfs(0)
            return self.res
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    思路2

    使用动态规划后,解决。代码如下:

    class Solution(object): # 使用dp
        def numDecodings(self, s):
            """
            :type s: str
            :rtype: int
            """
            n = len(s)
            dp = [0 for _ in range(n+1)]
            dp[0] = 1
            if s[0]=='0':
                return 0
            else:
                dp[1] = 1
            # 11106 
            for i in range(2, n+1):
                tmp = int(s[i-2:i])
                if s[i-2]!='0' and tmp <= 26:
                    dp[i] += dp[i-2]
                if s[i-1]!='0':
                    dp[i] += dp[i-1]
                if dp[i]==0:
                    return 0
            return dp[n]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    MySQL图形管理工具的安装与使用
    vue中v-for和v-if同时使用的解决办法
    【图像配准】Canny边缘检测+模板配准红外可见光双路数据
    LVS+Haproxy
    求二叉树节点的个数——后序遍历
    力扣 21. 合并两个有序链表 C语言实现
    代码随想录-哈希表|ACM模式
    【Git】Git基本配置和常用命令
    面试字节跳动java岗被算法吊打,60天苦修这些笔记,侥幸收获offer
    2024 泛娱乐企业出海音视频选型攻略
  • 原文地址:https://blog.csdn.net/Zack_zc_zc/article/details/126878527