剑指Offer(第二版)面试题46:把数字翻译成字符串
题目要求:
给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。
1.动态规划
int Get_Translation(int num)
{
string str = to_string(num);
int digits = str.length();
vector<int> dp(digits+1);
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i < digits+1; ++i)
{
int temp = 10 * (str[i-2] - '0') + str[i-1] - '0';
if (temp > 25)
dp[i] = dp[i - 1];
else
{
dp[i] = dp[i - 1] + dp[i - 2];
}
}
return dp.back();
}
---------------------
作者:线上幽灵
来源:优快云
原文:https://blog.youkuaiyun.com/chen134225/article/details/81356789
版权声明:本文为博主原创文章,转载请附上博文链接!
2.递归
int getTransCount(const string & numstr, int i)
{
int len = numstr.size();
//超过长度,只有一种可能
if (i >= len - 1) {
return 1;
}
//[i]和[i+1]可以组合成一个字符的,有两种方案
if (i + 1 < len ) { int sum = (numstr[i] - '0') * 10 + numstr[i + 1] - '0'; if (sum > 9 && sum < 26) {
return getTransCount(numstr,i+1) + getTransCount(numstr,i+2);
}
}
//不能组合成一个字符的
return getTransCount(numstr, i + 1);
}
本文探讨了将数字翻译成字符串的问题,通过两种方法解决:动态规划和递归。动态规划利用vector存储中间结果,避免重复计算;递归则直接通过函数调用解决问题,但可能遇到效率和栈溢出问题。
468

被折叠的 条评论
为什么被折叠?



