动态规划之三—— 从暴力递归到动态规划_数字字符串转字母字符串

题目:

规定1 和A 对应,2 和B对应,3 和C 对应 ... 那么一个数字字符串,比如“111” 就可以转化为:“AAA” 、“KA”、“AK” 。要求:给定一个只有数字字符组成的字符串str, 返回有多少种转化结果?

题目分析:

根据题目描述可知:数字1~26 是有对应的字母与之对应的,但超过26的数字无法给出对应字母,表明给出的是一个无效字符。对于数字0,比较特殊,当它单独出现的时候,没有与之对应的字母,但是它的前面是1 或者2 时,合并组成的两位数10 和20 是有可以转化成对应字母的,当然大于2后(30 >26)又为无效。

思路:

1.逐一遍历字符串, 当遍历到最后一个字符时,即完成一次转化。

2.当str[index] == '0'  时, 即表明出现无效字符。因为‘0’ 不可单独出现,一定是作为两位数中的个位数参与判断。

3. 当str[index] != '0' 时判断下一个字符

4. 当str[index+1] 没有越界,并且str[index] 与 str[index+1] 组成的两位数没有超过26, 则两这两个字符合并后,继续判断str[index+2];

5. 步骤1 和步骤2 即为递归的base case

代码实现:

//代码段1
#include <iostream>
#include <string>using namespace std;int process(string& str, int index){if(index == str.lenght()){return 1;}if(str[index] == '0'){return 0;}int way = process(str, index+1);if(index+1 < str.length() && (str[index]-'0')*10 - str[index+1]-'0' < 27){way += process(str, index+2);} return way;
}
int number(string& str){if(str.length() == 0){return 0;}return process(str, 0);
}
int main(){string str = "112";cout << "number: " << number(str) << endl;return 0;
}

运行结果:

优化为动态规划:

将递归过程改写为动态规划表来实现。

思路:

1.  分析递归函数的可变参数,发现只有index一个, 所以动态规划表是1维的,即动态规划表只与index有关。

2. 因为递归的base case中,迫使递归结束原因是 index == 字符数组长度值N,且表示完成1次转化,所以动态规划表dpArr 的大小为N+1,  且dpArr[N] = 1;

3. 通过已知的dpArr[N] ,从N到0, 依次填写动态规划表,即将调用递归函数的地方改为调用动态规划表dpArr

4. 动态规划函数返回的是dpApp[0];

代码实现:

#include <string>
#include <iostream>using namespace std;int dp(string& str){if(str.length() == 0) return 0;int N = str.length();int dpArr[N+1] = {0};dpArr[N] = 1;for(int i = N-1; i >= 0; i--){if(str[i] != '0'){int way = dpArr[i+1];if(i+1 < N && (str[i] - '0')*10 - str[i+1]-'0' >27){way += dpArr[i+2];}dpArr[i] = way;}}     return dpArr[0];
}int main(){string str = "112"cout << "dp: " << dp(str) << endl;return 0;
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

客户端与服务器通讯详解(4):支持实时通讯的协议

在之前的章节中&#xff0c;贝格前端工场给大家分享了客户端与服务器通讯详解定义、流程、协议、方式。本次重点分享实时通讯方式是什么&#xff0c;该如何实现&#xff0c;有哪些协议&#xff0c;欢迎大家点赞评论转发。 一、客户端与服务器实时通讯是什么 客户端与服务器实…

SQL labs-SQL注入(二)

环境搭建参考 SQL注入&#xff08;一&#xff09; 一&#xff0c;SQL labs-less2。 http://192.168.61.206:8001/Less-2/?id-1 union select 1,2,group_concat(username , password) from users-- 与第一关没什么太大的不同&#xff0c;唯一区别就是闭合方式为数字型。 二…

解决:uniapp 小程序 使用swiper 内部嵌套另外一个拥有左右滑动组件导致滑动冲突

解决办法 在swiper-item 内增加这个属性进行包裹 touchmove.stop <div touchmove.stop><qiun-data-charts type"area" :opts"optsStg" :chartData"dateDataStg" /> </div>

微信小程序中Map组件Marker中把Label文字信息通过按钮显示或隐藏

wxml页面按钮 <button bindtap"toggleLabel">Toggle Label</button>js data:{labelMarkerId: null // 记录当前显示文本的标记的 id }, //按钮切换显示 toggleLabel() {// 判断当前是否有显示的文本标记if (this.data.labelMarkerId ! null) {// 如果…

zabbix添加钉钉告警机器人使用bash和python两种脚本

zabbix添加钉钉告警机器人使用bash和python两种脚本 查看脚本目录 vi /etc/zabbix/zabbix_server.conf# 脚本存放路径 AlertScriptsPath/usr/lib/zabbix/alertscripts编写脚本&#xff08;二选一&#xff09; bash脚本 编写脚本 cd /usr/lib/zabbix/alertscripts vi zabbi…

AV1技术学习:Quantization

量化是对变换系数进行&#xff0c;并将量化索引熵编码。AV1的量化参数 QP 的取值范围是0 ~ 255。 一、Quantization Step Size 在给定的 QP 下&#xff0c;DC 系数的量化步长小于 AC 系数的量化步长。DC 系数和 AC 系数从 QP 到量化步长的映射如下图所示。当 QP 为 0 时&…

qt初入门8:下拉框,输入框模糊查询,提示简单了解 (借助QCompleter)

实现一个简单的模糊查询的逻辑&#xff0c;输入框能提示相关项。 主要借助qt的QCompleter 类&#xff08; Qt 框架中提供的一个用于自动补全和模糊搜索的类&#xff09;&#xff0c;结合一些控件&#xff0c;比如QComboBox和QLineEdit&#xff0c;实现模糊查询的功能。 1&…

科普文:百度交易中台之系统对账篇

百度交易中台作为集团移动生态战略的基础设施&#xff0c;面向收银交易与清分结算场景&#xff0c;赋能业务、提供高效交易生态搭建。目前支持百度体系内多个产品线&#xff0c;主要包括&#xff1a;度小店、小程序、地图打车、文心一言等。本文主要介绍了百度交易中台的交易链…

海康威视综合安防管理平台 detection 前台RCE漏洞复现

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 海康…

总结——TI_音频信号分析仪

一、简介 设备&#xff1a;MSPM0G3507 库&#xff1a;CMSIS-DSP TI 数据分析&#xff1a;FFT 软件&#xff1a;CCS CLion MATLAB 目的&#xff1a;对音频信号进行采样&#xff08;滤波偏置处理&#xff09;&#xff0c;通过FFT获取信号的频率成分&am…

keras框架的to_categorical方法

在阅读keras的中文文档时候&#xff0c;对于这里的代码不了解 y_train keras.utils.to_categorical(np.random.randint(10, size(1000, 1)), num_classes10)这里应该拆分为两部分看待 第一个是np.random.randint() 查看numpy文档知道&#xff1a; random.randint ( low , hi…

AWS DMS MySQL为源端,如何在更改分区的时候避免报错

问题描述&#xff1a; 文档[1]中描述MySQL compatible Databases作为DMS任务的源端&#xff0c;不支持MySQL 分区表的 DDL 更改。 在源端MySQL进行分区添加时&#xff0c;日志里会出现如下报错&#xff1a; [SOURCE_CAPTURE ]W: Cannot change partition in table members…

【表单组件】地址组件新增精简模式

07/17 主要更新模块概览 快速筛选 精简模式 触发条件 自定义域名 01 表单管理 1.1 【表单组件】-数据关联组件新增快速筛选功能 说明&#xff1a; 数据关联组件新增快速筛选功能&#xff0c;用户在数据关联组件选择数据时&#xff0c;可以通过快速筛选功能&#xff0…

萝卜快跑突然就火了,背后发生了什么?

近日&#xff0c;百度旗下的自动驾驶出行平台“萝卜快跑”突然在网络上火了起来&#xff0c;成为热门话题。那么&#xff0c;这背后到底发生了什么&#xff1f; 1. 数字误传引发热议 首先&#xff0c;一些误传的数字在传播中起到了推波助澜的作用。例如&#xff0c;百度在2023…

Camtasia Studio2024最新版本新功能,并深入学习它的使用教程

在视频创作和教学内容制作领域&#xff0c;Camtasia Studio 一直是备受青睐的工具。随着 2024 版本的推出&#xff0c;Camtasia Studio 带来了更多强大的功能和优化&#xff0c;为用户提供了更高效、更便捷的创作体验。接下来&#xff0c;让我们详细了解一下 Camtasia Studio 2…

只需三步,即可使用 Kafka 托管服务快速部署微服务架构应用

微服务架构的应用程序的特点是将其组件组织得能够独立地进行开发、测试、部署和扩展。DigitalOcean App Platform&#xff08;应用平台&#xff09;的目标是通过允许用户在同一应用上添加多个组件&#xff0c;简化这一架构模型&#xff0c;使其更加平滑和易于管理。 一个简单的…

【BUG】已解决:TypeError: expected string or bytes-like object

TypeError: expected string or bytes-like object 目录 TypeError: expected string or bytes-like object 【常见模块错误】 【解决方案】 常见原因及解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰…

【BUG】已解决:libpng warning: iccp: known incorrect sRGB profile

已解决&#xff1a;libpng warning: iccp: known incorrect sRGB profile 目录 已解决&#xff1a;libpng warning: iccp: known incorrect sRGB profile 【常见模块错误】 错误原因&#xff1a; 原因分析 解决方案 具体步骤 欢迎来到英杰社区https://bbs.csdn.net/topics…

Vue3 对比 Vue2

相关信息简介2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09; 2 年多开发, 100位贡献者, 2600次提交, 600次 PR、30个RFC Vue3 支持 vue2 的大多数特性 可以更好的支持 Typescript&#xff0c;提供了完整的…

QT5.9.9+Android开发环境搭建

文章目录 1.安装准备1.1 下载地址1.2 安装前准备2.安装过程2.1 JDK安装2.1.1 安装2.1.2 环境变量配置2.2 SDK配置2.2.1 安装2.2.2 环境变量配置2.2.3 adb 错误解决2.2.4 其他SDK安装2.2.5 AVD虚拟机配置2.3 NDK配置2.4 QT 5.9.9安装配置2.4.1 QT安装2.4.2 配置安卓环境3.QT工程…