力扣每日一题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 只包含数字,并且可能包含前导零。

通过次数

285.3K

提交次数

855.5K

通过率

33.3%

思路和题解(动态规划):

设定一个数组dp[n+1],用dp[i]表示 从第1个位置开始到第i个数字结束 的字符串的解码方法的总数,dp[0]=1;当第i个数字等于零时dp[i]=0;当第i个数字不等于零时,表示可以先解码到第i-1个数,再解码解到第i个数,此时dp[i]+=dp[i-1];此时再判断i的前两个数字(要保证i>=2)组成的数是不是在[1,26]内,如果是,表示可以先解码到第i-2个数,再解码解到第i个数,则dp[i]+=dp[i-2];最后dp[n]即为答案。

代码:

cpp 复制代码
class Solution {
public:
    int numDecodings(string s) {
        int n=s.length();
        vector<int> dp(n+1,0);
        dp[0]=1;
        for(int i=1;i<=n;i++)
        {
            //从前面第一个跳过来
            if(s[i-1]!='0')
            {
                dp[i]+=dp[i-1];
            }
            //从前面第二个跳过来
            if( i>1&&s[i-2]!='0'&&((s[i-2]-'0')*10+s[i-1]-'0')<=26 )
            {
                dp[i]+=dp[i-2];
            }
        }
        return dp[n];
    }
};
相关推荐
无心水4 小时前
【任务调度:数据库锁 + 线程池实战】3、 从 SELECT 到 UPDATE:深入理解 SKIP LOCKED 的锁机制与隔离级别
java·分布式·科技·spring·架构
编程小白gogogo5 小时前
苍穹外卖图片不显示解决教程
java·spring boot
舟舟亢亢5 小时前
算法总结——二叉树【hot100】(上)
java·开发语言·算法
百锦再5 小时前
Java中的char、String、StringBuilder与StringBuffer 深度详解
java·开发语言·python·struts·kafka·tomcat·maven
weixin_477271696 小时前
根象:树根。基石。基于马王堆帛书《周易》原文及甲骨文还原周朝生活活动现象(《函谷门》原创)
算法·图搜索算法
普通网友6 小时前
多协议网络库设计
开发语言·c++·算法
努力努力再努力wz6 小时前
【Linux网络系列】:TCP 的秩序与策略:揭秘传输层如何从不可靠的网络中构建绝对可靠的通信信道
java·linux·开发语言·数据结构·c++·python·算法
daxi1507 小时前
C语言从入门到进阶——第9讲:函数递归
c语言·开发语言·c++·算法·蓝桥杯
yy.y--7 小时前
Java数组逆序读写文件实战
java·开发语言
持续学习的程序员+18 小时前
强化学习Q-chunking算法
算法