给定一个数字num—>[0,2^31],设有一个翻译方法,将0与a对应,25与z对应,试问这个数字有多少种翻译方法。
1、Do1运用递归是实现;
2、Do2在递归中加入了unorder_map,来记住中间的重复的步骤;
3、运用递归,状态方程f(n)=f(n-1)+g(x)*f(n-2).
#include<iostream>
using namespace std;
#include<unordered_map>
class Translation_num {
public:
static int Do1(int num)
{
if (num<10 and num>-1)
return 1;
int target = num % 100;
if (target > 9 && target < 26)
{
return Do1(num / 10) + Do1(num / 100);
}
return Do1(num / 10);
}
static int Do2(int num)
{
unordered_map<int, int> cache;
return dfs(num, cache);
}
static int Do3(int num)
{
if (num<10 && num>-1)
return 1;
int len = 1;
for (int i = num; i > 10; i /= 10)
len++;
vector<int> dp(len + 1);
dp[0] = 1;
dp[1] = 1;
for (int i = 2; num > 10;num /= 10, i++)
{
int target = num % 100;
if (target > 9 && target < 26)
dp[i] = dp[i - 1] + dp[i - 2];
else
dp[i] = dp[i - 1];
}
return dp[len];
}
private:
static int dfs(int num, unordered_map<int, int> cache)
{
if (num<10 && num>-1)
return 1;
if (cache.find(num) != cache.end())
return cache[num];
int target = num % 100;
if (target > 9 && target < 26)
{
cache[num] = dfs(num / 10, cache) + dfs(num / 100, cache);
return cache[num];
}
cache[num] = dfs(num / 10,cache);
return cache[num];
}
};
void main()
{
int num = 12;
cout << "Do1:" << Translation_num::Do1(num)<<endl;
cout << "Do2:" << Translation_num::Do2(num) << endl;
cout << "Do3:" << Translation_num::Do3(num) << endl;
return;
system("pause");
}