剑指offer——48把数字翻译成字符串

题目要求:

给定一个数字,按照如下规则翻译成字符串: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 

 1 1.动态规划
 2     int Get_Translation(int num)
 3     {
 4         string str = to_string(num);
 5         int digits = str.length();
 6         vector<int> dp(digits+1);
 7         dp[0] = 1;
 8         dp[1] = 1;
 9         for(int i = 2; i < digits+1; ++i)
10         {
11             int temp = 10 * (str[i-2] - ‘0‘) + str[i-1] - ‘0‘;//计算十进制数
12             if (temp > 25)
13                 dp[i] = dp[i - 1];//那么组不成新的子串
14             else
15             {
16                 dp[i] = dp[i - 1] + dp[i - 2];//能组成新的串
17             }
18         }
19         return dp.back();
20     }
21 2.递归
22     int getTransCount(const string & numstr, int i)
23 {
24     int len = numstr.size();
25 //超过长度,只有一种可能
26     if (i >= len - 1) {
27         return 1;
28     }
29     //[i]和[i+1]可以组合成一个字符的,有两种方案
30     if (i + 1 < len ) { int sum = (numstr[i] - ‘0‘) * 10 + numstr[i + 1] - ‘0‘; if (sum > 9 && sum < 26) {
31             return getTransCount(numstr,i+1) + getTransCount(numstr,i+2);
32         }
33     }
34     //不能组合成一个字符的
35     return getTransCount(numstr, i + 1);
36 }       

原文地址:https://www.cnblogs.com/zzw1024/p/11695535.html

时间: 2024-10-27 13:10:30

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

剑指offer:把数字翻译成字符串

题目要求:给定一个数字,按照如下规则翻译成字符串:0翻译成"a",1翻译成"b"...25翻译成"z".一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi.实现一个函数,用来计算一个数字有多少种不同的翻译方法. # -*- coding: utf-8 -*- # @Time : 2019-07-10 21:13 # @Author : Jayce Wong # @ProjectName : j

剑指Offer对答如流系列 - 把数字翻译成字符串

面试题46:把数字翻译成字符串 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻译成"b",--,11翻译成"l",--,25翻译成"z".一个数字可能有多个翻译.例如12258有5种不同的翻译,它们分别"bccfi", "bwfi", "bczi", "mcfi" 和"mzi" .请编程实现一个函

《剑指offer》第四十六题:把数字翻译成字符串

// 面试题46:把数字翻译成字符串 // 题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻 // 译成"b",……,11翻译成"l",……,25翻译成"z".一个数字可能有多个翻译.例 // 如12258有5种不同的翻译,它们分别是"bccfi"."bwfi"."bczi"."mcfi"和 // "mzi&qu

剑指offer (48) c++实现一个不能被继承的类

题目:用c++实现一个不能被继承的类 题解分析: 常规解法: 首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数.同样,子类的析构函数也会自动调用父类的析构函数. 要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数. 那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数.析构函数而导致编译错误. 可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢? 这难不倒我们,我们可以通过定义静态函数来创建和释放类的实例.基于这个思路,我们可以

【剑指offer】删除在另一个字符串中出现的字符

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"They are students."和"aeiou",则删除之后的第一个字符串变成"Thy r stdnts.". 这里主要要分析两个方面: 1.如何判断那些字符是需要删除的字符.同很多字符串问题一样,可以开辟

【Offer】[46] 【把数字翻译成字符串】

题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串: 0翻译成"a",1翻译成"b",..... 11翻译成"1",...... 25翻译成"z".一个数字可能有多个翻译.例如,12258有5种不同的翻译,分别是"bccfi""bwfi"."bczi"."mcfi"和"mzi&q

剑指offer系列47:堆成的二叉树

这个题的主要思路是: 用二叉树的左子树的右子树和右子树的左子树比较,再用左子树的左子树和右子树的右子树比较.(好像有点绕,但其实就是堆成的思想) 剑指offer的说法是用数的前序遍历的两个方法,前序遍历应该是:根->左->右.但是我们用另一种前序遍历:根->右->左.如果这两个序列一样就判断它是对称的. 这两个方法在实现上其实是一样的. 1 class Solution { 2 public: 3 bool isSymmetrical(TreeNode* pRoot) 4 { 5

剑指offer之【表示数值的字符串】

题目: 表示数值的字符串 链接: https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2?tpId=13&tqId=11206&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100",&quo

《剑指offer》面试题28:字符串排序(牛客网版本) java

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 这里尤其需要注意2点:1.所有组合不能重复,比如输入"aa",  那么输出的结果应当是"aa" : 2. 输出结果按字典序排序 如果用<剑指offer>上的方法,显然这两点都不能满足,比如