把数字翻译成字符串
编号:0027
试题来源:[leetcode]
试题描述
给定一个数字,按照如下规则将其翻译为字符串:0翻译成a
,1翻译成b
,
⋯
\cdots
⋯,25翻译成z
。一个数字可能有多种翻译,例如25
既有可能分开翻译成cf
,也有可能翻译成z
。请输出给定数字有多少种不同的翻译方法。
说明
- 0 ≤ n u m ≤ 2 31 0\leq num\leq 2^{31} 0≤num≤231
解答算法
算法思路
很显然这道题目应该是用动态规划的方法来看。我们假设dp[i]
代表的是前
i
i
i位数字的可能翻译种类,注意假设dp[0]=1
为了方便讨论,实际使用是从dp[1]
开始的。
那么显然对于任意的dp[i]
,假如将第i
位数字单独进行翻译,那么显然dp[i]=dp[i-1]
;加入将其与前一位数字合并进行讨论,那么就要求i-1 i
两个组合起来的二位数小于等于25,同时这里还有一个坑01
认为只能翻译成ab
,因此两个组合起来的二位数还应该大于等于10,满足这样的条件,dp[i]
的数目还应当加上dp[i-2]
。
代码实现
class Solution {
public:
int translateNum(int num) {
string Num = to_string(num); //这里为了方便取位,将数字变成了字符串
int size = Num.size();
int tmp;
stringstream ss; //用字符串流方便取得两位数字合成的二位数
vector<int> dp(size + 1, 0); //动态规划的dp数组
dp[0] = 1; //设初始值
dp[1] = 1;
for(int i = 2; i <= size; ++i)
{
dp[i] += dp[i - 1]; //肯定可以成立
ss.clear();
ss << Num.substr(i - 2, 2);
ss >> tmp;
if(tmp >= 10 && tmp <= 25) //判断tmp是否满足条件
dp[i] += dp[i-2];
}
return dp[size]; //返回结果
}
};
复杂度分析
时间复杂度为: O ( n ) O(n) O(n),整个过程只对数字的位数进行了一次遍历
空间复杂度为: O ( n ) O(n) O(n),使用了dp数组