题目要求:

给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”...25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。

解题思路:

  下面我们从自上而下和自下而上两种角度分析这道题目,以12258为例:

  自上而下,从最大的问题开始,递归 :

  

有很多子问题被多次计算,比如258被翻译成几种这个子问题就被计算了两次。

自然想到可以用动态规划来解决,用f(i)来表示从第i位数字开始不同的翻译数目,
我们可以写出转移矩阵

g(i,i+1)表示第i位和i+1位拼起来的数字在10~25范围内,值为1,否则为0。
先f(5) = 1, f(4) = 1
f(3) = f(4) + 0 = 1
f(2) = f(3) + f(4) = 2
f(1) = f(2) + f(3) = 3
f(0) = f(1) + f(2) = 5 

 .动态规划
int Get_Translation(int num)
{
    string str = to_string(num);
    int digits = str.length();
    vector<int> dp(digits+);
    dp[] = ;
    dp[] = ;
    for(int i = ; i < digits+; ++i)
    {
        int temp = * (str[i-] - '') + str[i-] - '';//计算十进制数
        if (temp > )
            dp[i] = dp[i - ];//那么组不成新的子串
        else
        {
            dp[i] = dp[i - ] + dp[i - ];//能组成新的串
        }
    }
    return dp.back();
}
.递归
int getTransCount(const string & numstr, int i)
{
int len = numstr.size();
//超过长度,只有一种可能
if (i >= len - ) {
return ;
}
//[i]和[i+1]可以组合成一个字符的,有两种方案
if (i + < len ) { int sum = (numstr[i] - '') * + numstr[i + ] - ''; if (sum > && sum < ) {
return getTransCount(numstr,i+) + getTransCount(numstr,i+);
}
}
//不能组合成一个字符的
return getTransCount(numstr, i + );
}       

剑指offer——48把数字翻译成字符串的更多相关文章

  1. 剑指 Offer 46. 把数字翻译成字符串 + 动态规划

    剑指 Offer 46. 把数字翻译成字符串 Offer_46 题目描述 题解分析 本题的解题思路是使用动态规划,首先得出递推公式如下 dp[i] = dp[i-1]+dp[i-2](如果s[i-1] ...

  2. 力扣 - 剑指 Offer 46. 把数字翻译成字符串

    题目 剑指 Offer 46. 把数字翻译成字符串 思路1(递归,自顶向下) 这题和青蛙跳台阶很类似,青蛙跳台阶说的是青蛙每次可以跳一层或者两层,跳到第 n 层有多少种解法,而这题说的是讲数字翻译成字 ...

  3. 【Java】 剑指offer(46) 把数字翻译成字符串

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成" ...

  4. 每日一题 - 剑指 Offer 46. 把数字翻译成字符串

    题目信息 时间: 2019-07-02 题目链接:Leetcode tag: 动态规划 难易程度:中等 题目描述: 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ...

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

    题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,25 ...

  6. 剑指offer-面试题46-把数字翻译成字符串-动态规划

    /* 题目: 给定一个数字,将0~25依次翻译为a~z,计算有多少种翻译方法. */ /* 思路: 动态规划法 */ #include<iostream> #include<cstr ...

  7. 《剑指offer》第四十六题(把数字翻译成字符串)

    // 面试题46:把数字翻译成字符串 // 题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻 // 译成"b",……,11翻译成&qu ...

  8. 剑指 Offer 48. 最长不含重复字符的子字符串 + 动态规划 + 哈希表 + 双指针 + 滑动窗口

    剑指 Offer 48. 最长不含重复字符的子字符串 Offer_48 题目详情 解法分析 解法一:动态规划+哈希表 package com.walegarrett.offer; /** * @Aut ...

  9. 【剑指Offer】把二叉树打印成多行 解题报告(Python)

    [剑指Offer]把二叉树打印成多行 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

随机推荐

  1. Windows 8.1 PLSQL_32连接到RHEL6.1 Oracle10gr2_64

    目录 目录 系统环境 连接Oracle Server 系统环境 操作系统 Windows 8.1 RHEL6.1 软件 Oracle10gr2 PL/SQL instantclient-basic-w ...

  2. java 多级图的最短路径

    求最短路径众所周知有Dijistra算法.Bellman-ford等,除了这些算法,用动态规划也可以求出最短路径,时间复杂度为O(n^2), 跟没有优化的Dijistra算法一样(优化后的Dijist ...

  3. 2019牛客多校第⑨场J Symmetrical Painting(思维,离散化)

    原题:https://ac.nowcoder.com/acm/contest/889/J 题意: 二维平面上有n个矩形,每个矩形左下角是(i−1,Li)(i−1,Li), 右上角是(i,Ri)(i,R ...

  4. Java数据类型简介

    Java数据类型 以下两行Java代码定义了两个整数:num1和num2: num1和num2是两个int类型的变量. int关键字指定它的后面是变量的名称,并表示数据类型整数,例如:10,15,70 ...

  5. mySQL学习入门教程——2.创建表

    二.创建表 一.创建数据表的SQL语句模型(弱类型)CREATE TABLE [IF NOT EXISTS] 表名称(字段名1 列的类型[属性][索引],字段名2 列的类型[属性][索引],-字段名n ...

  6. cenos7 下数据库相关操作

    1.Linux Centos7下如何确认MySQL服务已经启动 https://www.cnblogs.com/qianzf/p/7082484.html 2.CentOS 7上安装MySQL并配置远 ...

  7. stty - 改变并打印终端行设置

    总览 stty [-F device] [--file=device] [SETTING]... stty [-F device] [--file=device] [-a|--all] stty [- ...

  8. rabbitmq AmqpClient 使用Topic 交换机投递与接收消息,C++代码示例

    // strUri = "amqp://guest:guest@192.168.30.11:8820/test" // strUri = "amqp://[帐户名]:[密 ...

  9. 视频专家之路【三】:Vs开发环境的搭建

    本文是听了雷宵骅大神的课之后的总结,部分内容借用了其PPT的内容,如有侵权请告知删除. 雷宵骅大神的博客为:https://blog.csdn.net/leixiaohua1020 这里提及一点,原来 ...

  10. Recycleview点击事件监听器(转自:http://www.jianshu.com/p/f2e0463e5aef)

    package com.taven.uav.view; import android.content.Context;import android.support.v7.widget.Recycler ...