Leetcode 91. 解码方法——————从我刷了五十多道力扣后决定从C转向C++再由这题让我下定先好好学习算法的那些事

LeetCode刷题模版:91 - 100 Hello!ଘ(੭ˊᵕˋ)੭昵称:海轰标签:程序猿|C++选手|学生简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!唯有努力💪本文仅记录自己感兴趣的内容文章仅作为个人学习笔记记录,记录从0到1的一个过程希望对您有一点点帮助,如有错误欢迎小伙伴指正。 阅读详情

一条包含字母 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 位 的整数。
在这里插入图片描述

  • 我的错误题解
//只想到了一个2^n - 1,还要考虑前置0的问题
//int findone(string s){
//    int count = 0;
//    for (int i = 0; i < s.size(); ++i) {
//        if (s[i]=='1'&&i!=s.size()-1){
//            count++;
//        }
//    }
//    return count;
//}//1的右侧随便使用
//int findtwo(string s){
//    int count = 0;
//    for (int i = 0; i < s.size()-1; ++i) {
//        if (s[i]=='2'&&(s[i+1]=='0'||s[i+1]=='1'||s[i+1]=='2'||s[i+1]=='3'||s[i+1]=='4'||s[i+1]=='5'||s[i+1]=='6')){
//            count++;
//        }
//    }
//    return count;
//}//2的右侧要小于等于6才可以构成字母
//int findzero(string s){
//    int count = 0;
//    for (int i = 0; i < s.size(); ++i) {
//        if(s[i]=='0'){
//            count++;
//        }
//    }
//    return count;
//}
//int numDecodings(string s) {
////    if(s.size()==1&&s[0]!='0'){
////        return 1;
////    }
////    if(s.size()==2&&(s[0]=='1'||s[0]=='2')){
////        return 2;
////    }
//    //耻辱面向case
//
//    int cishu   = 0;
//    int zeronum = 0;
//    zeronum=findzero(s);//看看数组里面有没有0
//    if(zeronum==0){
//        if(s.size()>2){
//            cishu=pow(2,findone(s)+findtwo(s))-1;
//        }
//        else if(s.size()==1){
//            cishu=1;
//        }
//        else if(s.size()==2){
//            cishu=pow(2,findone(s)+findtwo(s));
//        }
//    }
//    else{
//        if(s.size()>2){
//            if(s[0]=='0'){
//                s.erase(0,1);
//                return numDecodings(s);
//            }
//            cishu=pow(2,findone(s)+findtwo(s)-zeronum)-1;
//        }
//        else if(s.size()==2&&s[0]=='0'){
//            return 0;
//        }
//        else {
//            cishu=1;
//        }
////        if(s.size()==1&&s[0]=='0'){
////            cishu=0;
////        }
//    //我操了,还有这么多前置0,还得重新编关于0的代码
//    }
//    return cishu;
//}

我的题解淋漓尽致地表现出了我的笨蛋和弱智天分,一流的。想通过暴力方法解决问题,却没那个本事,到最后悲剧收尾,哭了。大体思考过程是这样的:
1、因为题目是通过字符串数组中的整型元素映射,我就分开看,想通过寻找一个整体的规律。根据我的猜测这个和2^n-1有相似之处,我就着手思考
2、找出字符串中的 ‘1’ (除了最后一个位置,因为最后一个位置无法进行组合,当做普通数字)。数字1不管后面什么数字都可以组成字母映射。
3、找出字符串中的 ‘2’ (除了最后一个位置,且下一个数只能小于等于6,因为字母只有26个)
4、找出字符串中的 ‘0’ (这个是任何位置,因为存在0的字符串必定是特殊的,即可能存在前置0影响算法设计)
5、在都得到之后我应用了pow()方法,找到的1和2数量和是指数,最后-1,寻找到的规律。结果在我提交后,遇到了多个难受的例子。首先我这个方法无法对长度小于3的数组进行判断,因为可能出现0 。 且可能出现“00001”,草!
6、我逐渐走向了放弃,因为已经花了很多时间了,我决定去看题解,然后仔细分析大佬的思想。

  • 大佬的题解(Dynamic Programming)
int numDecodings(string s) {
    int n = s.size();
    vector<int> f(n + 1);
    f[0] = 1;
    for (int i = 1; i <= n; ++i) {
        if (s[i - 1] != '0') {
            f[i] += f[i - 1];
        }
        if (i > 1 && s[i - 2] != '0' && ((s[i - 2] - '0') * 10 + (s[i - 1] - '0') <= 26)) {
            f[i] += f[i - 2];
        }
    }
    return f[n];
}

大佬是如此建立转移方程的,如果把答案看成一个可分割整体,用 f[n] 代表前n位可以组成的映射的话,就可以如此分析问题:
1、第一种情况是我们使用了一个字符,即 s[i] 进行解码,我们只要要求 s[i]!=0 ,就一定能被解码。由于剩余的前 i-1个字符的解码方法数为f,因此我们可以写出状态转移方程:

f = f ( s[i] != 0)

2、第二种情况是我们使用了两个字符,即 s[i-1]
& s[i] 进行编码。与第一种情况类似, 其中 s[i-1] 不能等于0,并且 s[i-1] & s[i] 组成的整数必须小于等于26,这样它们就可以被解码成字母。由于剩余的前 i-2 个字符的解码数为 f,因此我们可以写出状态转移方程:

f=f (s[i-1]!=0 && 10*s[i-1]+s[i] <= 26)

需要注意的是当 i>1 的时候才能进行转移,否则s[i-1] 不存在。
大佬的代码成功让我吃瘪的,因为在i=0和i=1的时候我没玩明白,debug让我明白了代码的运行机制。
首先,边界值是f[0]=1,而递推的关系由我们的题目决定。明确所有f[i]初值都是0,除了f[0] 。
其次,每次迭代的时候分为两种情况,即可以两位组合的和不可以两位组合的。而这也有前置条件,即单位的时候不为0,两位一起进行组合的时候十位不为0 。
如果实在让我来解说这个DP方法的话,我愿意将f[0]和f[1]均称为边界值。只不过由于题目的关系,f[1]的取值需要由第一位是不是0来决定。要是让我来写这个方法,而我又对DP一知半解的话,我可能将这个分开,不过分开后我可能又考虑不到特殊情况。就像“00001”。擦!!!!
最后,进行一下实例的分析,这个其实也类似于树。

若数组为{1,3,4,1,2,3}
我们看最后两位{2,3}
首先看3->f[6]=f[6]+f[5]
其次有2,3->f[6]=f[6]+f[4]
其中f[4]存储的是前四位的映射可能性,f[5]同理
这里是从后向前看,因此限制i>1,将所有情况分析到。

我发现,主要思想还是将两位看成整体,组合后一定和前面组合,而加了一个最后两个字符组合的情况,就考虑到了前面和后面可以组合的情况。因为单独考虑一个数字的时候,可能前面的单个数字是1或者2,可以和这个单个数字进行组合从而映射。这太秒了,所有情况尽收囊中。

抱歉了,我可能这几天对力扣暂时停一下了,因为在我刷题的过程中我越来越觉得举步维艰。我的朋友也对我说:“能用自己的方法做出题,尽管有时不是最优解,已经很不错了。不过你要是能站在巨人的肩膀上,在学习算法知识的过程中形成自己的思维框架,你肯定能获得更长足的进步。”
我也决定了,将刷题的脚步停一下,对算法进行系统地学习,期间会刷一些简单的题,每天也会做一道题进行签到,不过不会用超过一个小时的时间了。下面可能就是我的算法学习blog了,力扣系列暂时pause!!!!!!!!!!

新手必看:5分钟搞定Unitree Go1机器狗Gazebo仿真运动控制(附按键图解) 本文为新手提供了Unitree Go1机器狗在Gazebo仿真环境中实现运动控制的快速指南。通过5分钟极简配置和按键图解,帮助开发者快速掌握宇树科技明星产品的基础操作,包括环境搭建、仿真启动和运动控制技巧,适合零基础用户快速上手。 阅读详情

相关推荐

MOS管开关设计知识-(五种MOS管开关电路图方式)

在使用MOS管设计开关电源或者马达驱动电路的时候,大部分人都会考虑MOS的导通电阻,最大电压等,最大电流等,也有很多人仅仅考虑这些因素。这样的电路也许是可以工作的,但并不是优秀的,作为正式的产品设计也是不允许的。 下面是我对MOSFET及MOSFET驱动电路基础的一点总结,其中参考了一些资料,非全部原创。包括MOS管的介绍,特性,驱动以及应用电路。 1、MOS管种类和结构 MOSFET管是FET的...

树卡花 7万+

java1-26对应a-z,2021-02-17:规定1和A对应、2和B对应、3和C对应...26和Z对应,那么一个数字字符串比如"11...

2021-02-17:规定1和A对应、2和B对应、3和C对应...26和Z对应,那么一个数字字符串比如"111”就可以转化为:"AAA"、"KA"和"AK"。给定一个只有数字字符组成的字符串str,请问有多少种转化结果?福哥答案2021-02-17:自然智慧即可。1.递归。有代码。2.动态规划。有代码。代码用golang编写,代码如下:package mainimport "fmt"func ma...

weixin_29056701的博客 773

sap销售发货的流程_SAP销售订单发货后如何实现发票的自动创建?

问SAP销售订单发货后如何实现发票的自动创建?答业务场景有些快消零售企业,SAP系统单据量大,单据金额少,一般在销售发货后即可确认收入。此时无需人工在系统内操作VF01或者VF04进行开票操作,可将该操作设置成后台作业进行自动批量开票,具体操作如下:1、定义任务:VF06输入完以上信息,点击保存进入以下界面:说明:当前日期的意思是“开票的日期”等于“系统电脑中的当前日期”当前日期+/-...

weixin_42358409的博客 3357

js闭包函数

如以下代码所示 functiontestFuncA(){ letnum=1; functiontestFuncB(resultNum){ returnresultNum++; } /**写法1**/ vartestFuncC=function(){ returntestFunc...

apple_58054055的博客 224

AD21导出gerber文件

文件–>制造输出–>Gerber Files 文件–>制造输出–>Gerber Files 通用、光圈和高级跟第一步一样 3.文件–>制造输出–>NC Drill Files 这个默认就可以了 主要参考视频来自bilibili添加链接描述 此篇博客主要是写给自己好记的,无其他商业用途 ...

新手小杨 1万+

群晖NAS从入门到精通的所有帖子汇总,只要这一篇就够了

本站陆陆续续的转载、原创帖子也有十几二十篇了,从不同的角度对群晖NAS的各种骚操作都有深入的讲解,虽然很多文章都不是讲的很深入,但是针对小白入门已经是足够了,希望对小白来说是一个入门,群晖NAS的大佬们勿喷,哪里写的不对的,请随时留言西安SEO优化站长一定在第一时间纠正修改。

西安SEO优化网站资源 8万+

leetcode 830 较大分组的位置

package com.example.lettcode.dailyexercises; import java.util.ArrayList; import java.util.List; /** * @Class LargeGroupPositions * @Description 830 较大分组的位置 * 在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分...

fengwuya的博客 129

centos+apache+subversion+LDAP

yum install subversion 报错:[Errno 14] HTTP Error 416 - Requested Range Not Satisfiable 正在尝试其它镜像。 zaici

qq_41566366的博客 1544

c到c++的过渡

1.c到c++的过度 1 2.类和对象 2 3.继承与派生 1 4.运算符重载 1 5.多态 1 6.函数模板与类模板 1 7.异常与文件 1 c++的基本知识 ------------------------------------ 8.STL 标准模板库 2 9.设计模式 2 10.QT 2+ mysql 1 1. 汇编 低级语言 可以直接操作硬件 MOV 移植...

qq_42664422的博客 321

RV1126B SDK移植实战:从DDR配置到USB烧写全解析

本文详细解析了RV1126B SDK移植的核心实战流程,重点攻克了DDR初始化失败与USB烧写两大难题。文章从理解启动流程入手,提供了DDR配置错误的排查步骤、SDK编译配置要点,并深入讲解了USB烧写的完整操作与常见问题解决方案,旨在帮助开发者高效完成系统移植与稳定运行。

weixin_29164497的博客 542

从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果

通过colmap进行的sfm的普通方式会丢失场景的物理尺度信息,并且并不在符合一般认知的坐标系下,本文将读取colmap生成的点云和相机pose,将其进行空间变换和缩放之后,重新保存,新保存的结果仍然可以被colmap读取以及进行后续的稠密重建以及3dgs等工作

诺有缸的高飞鸟的博客 1424

[C++]Leetcode超高效刷题顺序及题目详解笔记(持续更新中)

一.引言 博主最近在LeetCode上用C++练习。一路走来踩过一些坑,做了一些总结和笔记,分享给需要的人。 LeetCode网址:https://leetcode.com/ LeetCode中文版:https://leetcode-cn.com/ 二.刷题指南 LeetCode 是一个非常棒的平台,收集了许多公司的面试题目。相对其他平台而言,有着下面的几个优点: 题目全部来自业内大公司的真实面试不用处理输入输出 精力全放在解决具体问题上题目有丰富的讨论 可以参考别人的思路精确了解自己代码在所有提交代码中

cpb____的博客 2万+

YOLOv11涨点改进| TGRS 2026 顶刊| 注意力改进篇| 引入MSEA多尺度边缘感知注意力,助力红外小目标检测、遥感目标检测、工业缺陷检测、图像去雨雾任务高效涨点

🔥本文提出了一种基于MSEA多尺度边缘感知注意力的YOLOv11改进模型,通过增强网络对边缘、纹理和细粒度信息的感知能力,显著提升复杂背景下的目标检测性能。MSEA模块采用多尺度空洞卷积提取上下文特征,并通过边缘监督和注意力融合机制强化目标边界信息。实验表明该方法在小目标、边界模糊目标和复杂纹理目标检测任务中表现优异,尤其在遥感、工业缺陷和红外检测等场景具有显著优势。文章详细介绍了MSEA的结构原理、核心代码实现、模块配置方法以及三种YOLOv11改进方案.

Ai缝合怪、助力小伙伴高效发论文 180

LeetCode 91. 解码方法【c++/java详细题解】

本文收录于LeetCode高频面试题,480道后端面试高频力扣题解,欢迎订阅。 目录1、题目2、思路3、c++代码4、java代码 1、题目 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -> 26 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为: "AAJF" ,将消息分组为 (1 1 10 6) "KJF" ,将消息分组为 (11 10 6.

林深不见鹿 的博客 5532

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《C++ 动态规划》第004题:解码方法

本文详细讲解了LeetCode第91题"解码方法"的动态规划解法。文章首先介绍了问题描述,然后系统性地分析了算法原理:1) 定义状态dp[i]表示前i个字符的解码方法数;2) 分情况讨论单独解码和组合解码两种状态转移方式;3) 提供了两种初始化方法(直接初始化和辅助结点法);4) 给出了从左到右的填表顺序。最后附上了C++实现代码,包括常规解法和使用辅助结点的优化解法。该解法时间复杂度O(n),空间复杂度O(n),适用于处理数字字符串解码问题。

心向往之,行必能至 961

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

力扣刷题记录(c++)04

然后我们假设dp[i]是以s[i]为结尾的字符串的解码方法个数,可以发现如果s[i]可以被解码,则dp[i]就是dp[i-1],如果s[i-1]与s[i]可以一起被解码,那么dp[i]还要加上一个dp[i-2]。假设s长度为n,我们将dp数组长度设置为n+1,将dp[0]与dp[1]初始化为1,这样就不需要对特殊特殊情况特殊处理了,可结合代码理解。首先一个单字符可以被编码,则必须是大于0的,两个字符可以被编码必须是大于10,小于27的。代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且。

2301_80079840的博客 773

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

一条包含字母 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" 在映射中并不等

二当家的白帽子 2923

Leetcode 91. 解码方法 C++

Leetcode 91. 解码方法 题目 一条包含字母 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) 。 题解 动态规

weixin_43750513的博客 296

LeetCode第 91 题:解码方法(C++)

91. 解码方法 - 力扣(LeetCode) 很坑,亲测输入会出现0,而且从前往后条件真的多到哭,面向if-else编程,我真的想死: class Solution { public: int dp(string& s, int i, int j){ int n = j - i + 1; if(n == 0) return 0; if(n == 1) return s[i] == '0' ? 0 : 1; if(n ==

zj 500

C++ : 力扣_Top(88-122)

C++ : 力扣_Top(88-122) 文章目录C++ : 力扣_Top(88-122)88、合并两个有序数组(简单)91、解码方法(中等)101、对称二叉树(简单)102、二叉树的层序遍历(中等)103、二叉树的锯齿形层次遍历(中等)104、二叉树的最大深度(简单)105、从前序与中序遍历序列构造二叉树(中等)108、将有序数组转换为二叉搜索树(简单)116、填充每个节点的下一个右侧节点指针(...

麻城明歌的博客 729

【力扣刷题】解码方法

哈喽各位友友们😊,我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下!😘 都是精华内容,可不要错过哟!!!😍😍😍希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。

小梦的博客 417

2021-11-14 leetcode 动态规划 91.解码方法 c++

题目 leetcode 91.解码方法 In a brief: 将一串数字拆按不同方式拆分,但拆分后的个体的值的区间为1~26,求总拆分方法数。 思路 动态规划 定义 已知:字符串str[0…i…n] dp[i] :对于str[0…i]的字符串,所得解码的总数 求dp[i] 首先分析str[i],可能值为:‘0’, ‘1’, ‘2’ 解码总数取决于s tr[i]不同的取值,因此,对str[i]进行分类讨论: i) str[i] == '0’ 只有一个字符 '0’时,无法单独被解码。需要联系前面的一个字符。

weixin_51745630的博客 968

Hypit AI 视频克隆:3 步跑通你的第一条变体

想把一条爆款视频变成你自己的版本?换掉人物、台词和 B-roll,其余结构照搬。按本教程走完 3 个站点,你就能看到 Agent 产出第一条 Hypit 变体视频,总耗时约 10 分钟。 | 阶段 | 你的动作 | 得到什么 | 耗时 | |---|---|---|---| | 安装 | 跑 1 条 npx 命令 | Agent 获得视频制作知识 | 1 分钟 | | 喂素材 | 交出视频 +

gitblog_00016的博客 455

LeetCode91-解码方法

一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数。 示例 1: 输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。 示例 2: 输入: "226" 输出: 3 解释: 它可以解码为 "BZ" (2 26), "VF...

lyd1995的博客 804

Leetcode 91解码方法 C++

思路:和爬楼梯的那道题类似。用动态规划。 因为解码时数字要大于0,小于等于26.并且需要注意如果出现 08 并不能当做8来处理,也就是说一位数处理是为1~9,两位数处理是为10 ~ 26.当所遍历的位置为一位数时(不等于0),为dp[i]=dp[i-1];两位数时dp[i]=dp[i-1]+dp[i-2].下面的代码就计算两位数时,分两次加了dp[i-1]和dp[i-2].所以 会出现 dp[i...

qq_43387999的博客 430

【leetcode C++】 动态规划

leetcode 动态规划刷题

2301_79789645的博客 661
上一篇: Leetcode_598. 范围求和 II
下一篇: AlgarithmLearning_Day1:比较算法的对比————(太长了,先更新到Shell Sort)
Neepu_G.job
博客等级 码龄8年 7粉丝 69原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值