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

news2024/9/23 6:29:36

题目:

规定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.coloradmin.cn/o/1942852.html

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

相关文章

AV1技术学习:Transform Coding

对预测残差进行变换编码&#xff0c;去除潜在的空间相关性。VP9 采用统一的变换块大小设计&#xff0c;编码块中的所有的块共享相同的变换大小。VP9 支持 4 4、8 8、16 16、32 32 四种正方形变换大小。根据预测模式选择由一维离散余弦变换 (DCT) 和非对称离散正弦变换 (ADS…

只需三步申请 OV HTTPS证书

申请OV HTTPS证书的步骤主要包括申请、验证、安装三步。下面将详细展开分析每个步骤的具体操作和注意事项&#xff1a; 一、申请 选择证书供应商&#xff1a;一个可信赖且知名的证书供应商对于确保SSL证书质量和后续服务至关重要。市场上有多个知名品牌提供OV SSL证书&#xf…

运维上云/直播上云EasyNVS视频上云管理平台配置域名时的注意事项

EasyNVS视频上云管理平台拥有完整的视频流媒体服务能力和运维管理服务能力&#xff0c;不仅可以通过平台对EasyNVR、EasyGBS进行统一管理&#xff0c;还能解决设备现场没有固定公网IP却需要在公网直播的需求。 有用户反馈&#xff0c;在项目现场配置了EasyNVS的HTTPS证书&#…

Linux发展史

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

PCI设备BAR寄存器和PCI桥Base、Limit寄存器的初始化

初始化PCI设备的BAR&#xff08;Base Address Register&#xff09;寄存器和PCI桥的Base、Limit寄存器是配置PCI总线地址空间的关键步骤&#xff0c;这些寄存器的设置影响了系统中PCI设备和桥接器对地址空间的使用和访问。下面详细解释它们的初始化过程&#xff1a; PCI设备的…

【MySQL进阶之路 | 高级篇】ER模型

1. 概述 数据库设计是牵一发而动全身的。那么有没有什么办法可以提前看到数据库的全貌呢&#xff1f;比如需要哪些数据表&#xff0c;数据表中应该有哪些字段&#xff0c;通过什么字段进行连接等等。这样我们才能进行整体的梳理和设计。 其实&#xff0c;ER模型就是一个这样的…

Linux cd 和 pwd 命令

目录 1. 更改工作目录 cd 2. 查看当前工作目录 pwd 1. 更改工作目录 cd 打开虚拟机终端的时候&#xff0c;以用户的家目录为默认工作目录&#xff1b; 更多时候需要更改当前的工作目录&#xff08;Change Directory&#xff09;, 语法&#xff1a;cd 【Linux路径】 没有参数…

宏信超市净利率微薄:门店过于集中一地收入承压,近年来多次被罚

《港湾商业观察》廖紫雯 日前&#xff0c;江苏宏信超市连锁股份有限公司&#xff08;以下简称&#xff1a;宏信超市&#xff09;递表港交所&#xff0c;保荐机构为绰耀资本。 宏信超市为一家总部设于扬州的超市及便利店连锁运营商&#xff0c;以“宏信龙”品牌经营零售业务及…

短视频矩阵新选择,一键智能成片,效率翻倍!

在数字时代浪潮的推动下&#xff0c;短视频已成为人们生活中不可或缺的一部分。从社交娱乐到营销推广&#xff0c;短视频的身影无处不在&#xff0c;其影响力日益扩大。然而&#xff0c;对于内容创作者而言&#xff0c;如何在海量视频中脱颖而出&#xff0c;如何高效、高质量地…

SD 换脸局部重绘 + ipadapter

图生图&#xff0c;局部重绘 2. 配置ipadapter 3. 可以配置ADetailer 最后生成出来 真实丑哭了&#xff0c;完全不像

【保姆级讲解Docker容器 ! ! !】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

文档解析效果全维度测评标准

TextIn文档解析测评工具&#xff0c;全面评测文档解析产品能力 关注TechLead&#xff0c;复旦AI博士&#xff0c;分享AI领域全维度知识与研究。拥有10年AI领域研究经验、复旦机器人智能实验室成员&#xff0c;国家级大学生赛事评审专家&#xff0c;发表多篇SCI核心期刊学术论文…

【AI-10】PPO算法

强化学习中的PPO&#xff08;Proximal Policy Optimization&#xff09;是一种流行的策略优化算法&#xff0c;旨在改进和稳定策略梯度方法。PPO由OpenAI提出&#xff0c;因其简单性和良好的性能&#xff0c;在许多强化学习任务中被广泛应用。 PPO框架简介 PPO是一种基于策略…

【算法专题】链表算法题

1. 链表常用操作 相信大家在学习数据结构的过程中已经接触过许多链表相关的题目了&#xff0c;在正式开始刷题之前&#xff0c;我想让大家先回顾一下过去处理链表相关问题时的一些常见操作。 首先肯定就是创建新节点了&#xff0c;如果使用C语言编写代码&#xff0c;我…

MySQL第一阶段:表关系

表关系 表关系分为一对多、多对多、一对一 表关系之一对一 一对一比如用户和用户的详细内容 一对一关系多用于表拆分&#xff0c;将一个实体中经常要用的字段放在一张表&#xff0c;不经常使用的字段放到另一张表&#xff0c;用于提升查询性能。 实现方式&#xff1a;在任…

你了解你的GD32 MCU系统主频是多少吗 ?

系统时钟是GD32 MCU的时基&#xff0c;可以理解为系统的心跳&#xff0c;片上所有的外设以及CPU最原始的时钟都来自于系统时钟&#xff0c;因而明确当前系统时钟是多少非常重要&#xff0c;只有明确了系统时钟&#xff0c;才能够实现准确的定时、准确的采样间隔以及准确的通信速…

【Git】(基础篇七)—— IntelliJIDEA集成Git

InteliJ IDEA集成Git 现在有很多的集成工具帮助我们写代码&#xff0c;使用这些工具可以帮助我们加速写代码&#xff0c;很多工具也可以集成git&#xff0c;使用图形工具管理git&#xff0c;相信了解了底层运行逻辑的你能够很快地上手使用这些工具&#xff0c;本文以InteliJ I…

嘉立创 | 将所有元件属性中间放置

单击元件属性&#xff0c;按鼠标右键&#xff0c;点击查找 点击查找全部&#xff0c;便选中了所有元件属性 点击布局--属性位置 便可以将属性位置改为中间

销量不振,却逆风提价,出尔反尔的宝马在作茧自缚吗?

撰稿|行星 来源|贝多财经 传统豪华汽车品牌宝马&#xff0c;宣布主动退出价格战。 近日&#xff0c;社交平台上有关宝马涨价的传闻不胫而走&#xff0c;引发众多网友关注。相关报道称&#xff0c;有业内人士在社交平台透露&#xff0c;因价格战导致门店亏损严重&#xff0c;…

Python怎样读取URL生成PDF

1. 安装依赖的exe 需要在这个网址&#xff0c;安装一个exe包&#xff0c;地址&#xff1a;https://wkhtmltopdf.org/ 进入网址后&#xff0c;点这个位置&#xff1a; 选择一个你的操作系统的下载链接&#xff1a; 安装后的exe文件&#xff1a; C:\Program Files\wkhtmltopdf…