剑指 Offer 46:把数字翻译成字符串

简介: 剑指 Offer 46:把数字翻译成字符串

题目

题目链接

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

示例 1:

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

解题

方法一:回溯

可以把这道题看成字符串分割,“0”~"25"之间的字符串才是符合题意的

class Solution {
public:
    int res=0;
    bool isValid(string& strs,int start,int end){
        string s=strs.substr(start,end-start+1);
        if(s.size()==1&&s[0]<='9'&&s[0]>='0') return true;
        if(s.size()==2&&s>="10"&&s<="25") return true;
        return false;
    }
    void backtracing(string& strs,int startIndex){
        if(startIndex==strs.size()){
            res++;
            return;
        }
        for(int i=startIndex;i<strs.size();i++){
            if(isValid(strs,startIndex,i)){
                backtracing(strs,i+1);
            }
        }
    }
    int translateNum(int num) {
        string strs=to_string(num);
        backtracing(strs,0);
        return res;
    }
};

方法二:动态规划

参考链接

根据动态转移方程的需要,将没有数字的时候,定义为可以翻译一种,即dp[0]=1;

因为dp[1]=1,可以根据dp[0]=1直接传递。

dp[2]可以根据dp[0],dp[1]进行传递,值为1或者2

class Solution {
public:
    int translateNum(int num) {
        string strs=to_string(num);
        int n=strs.size();
        vector<int> dp(n+1,0);
        dp[0]=1,dp[1]=1;
        for(int i=2;i<=n;i++){
            if(strs[i-2]=='1'||(strs[i-2]=='2'&&strs[i-1]<'6')){
                dp[i]=dp[i-1]+dp[i-2];
            }
            else{
                dp[i]=dp[i-1];
            }
        }
        return dp[n];
    }
};

注意,必须要定义成vector dp(n+1,0)而不能是vector dp(n,0)

因为vector dp(n+1,0)初始化要定义dp[0]=1,dp[1]=1;

vector dp(n,0)初始化不能定义成dp[0]=1,dp[1]=2,因为没法保证dp[1]=2,因为2个字符,可能是一种翻译,也可能是两种,这样子的话,就要在定义dp[1]的时候就要判断了,不能像上面一种定义那样,一起放在循环里判断。

相关文章
|
弹性计算 缓存 负载均衡
阿里云 SLB 的创建及后端服务器的添加 | 学习笔记
快速学习阿里云 SLB 的创建及后端服务器的添加
1486 0
阿里云 SLB 的创建及后端服务器的添加 | 学习笔记
|
安全 Linux C++
【C++】内存管理常见面试题
【C++】内存管理常见面试题
183 0
|
12月前
|
监控 安全 网络安全
云计算环境下的网络安全策略与实践
在数字化时代,云计算已成为企业信息技术架构的核心组成部分。然而,随着云服务的普及,网络安全威胁也日益增多。本文旨在探讨云计算环境中的网络安全挑战,并提供实用的安全策略和措施,以帮助组织保护其数据和应用程序免受网络攻击。通过深入分析云服务模型、网络安全基础以及信息安全技术,本文将为读者提供一系列针对性的安全建议,包括身份和访问管理、数据加密、安全监控和响应等关键领域。文章还将讨论如何在云计算环境中实施这些策略,并强调持续安全意识和培训的重要性。
|
算法 网络性能优化 调度
基于De-Jitter Buffer算法的无线网络业务调度matlab仿真,对比RR调度算法
1. **功能描述**: 提出了一个去抖动缓冲区感知调度器,结合用户终端的缓冲状态减少服务中断。该算法通过动态调整数据包发送速率以优化网络延迟和吞吐量。 2. **测试结果**: 使用MATLAB 2022a进行了仿真测试,结果显示De-Jitter Buffer算法在网络拥塞时比RR调度算法更能有效利用资源,减少延迟,并能根据网络状态动态调整发送速率。 3. **核心程序**: MATLAB代码实现了调度逻辑,包括排序、流量更新、超时和中断处理等功能。 仿真结果和算法原理验证了De-Jitter Buffer算法在无线网络调度中的优势。
|
人工智能 弹性计算 API
通义万相AI绘画创作体验评测
从使用者的角度解读通义万相AI绘画创作方案的优与劣
11360 12
|
编译器 C++
【C++】如何用C++写一个日期计算器
【C++】如何用C++写一个日期计算器
|
存储 安全 API
深入剖析 Qt QMultiMap :原理、应用与技巧
深入剖析 Qt QMultiMap :原理、应用与技巧
489 1
|
存储 SQL PHP
彩虹外链网盘界面UI美化版超级简洁好看
彩虹外链网盘界面UI美化版超级简洁好看
241 0
|
算法 Java 调度
Semaphore实现原理全面解析
Semaphore(信号量)是一个同步工具类,通过Semaphore可以控制同时访问共享资源的线程个数。
|
存储 Kubernetes 负载均衡
【Kubernetes】神乎其技的K8s到底是什么,为什么被越来越多人使用
【Kubernetes】神乎其技的K8s到底是什么,为什么被越来越多人使用
36061 6