解题思路
第一步:定义数组元素的含义
题目要求的是一个数字有多少种不同的翻译方法,因此设dp[i]
代表第i个结尾的数字的翻译方案数量
第二步:找出关系数组元素间的关系式
若
x
i
x_{i}
xi和
x
i
−
1
x_{i-1}
xi−1组成的数字可以被翻译,
则dp[i]=dp[i-1]+dp[i-2]
,
x
i
−
1
x
i
ϵ
[
10
,
25
]
x_{i-1}x_{i}\epsilon [10,25]
xi−1xiϵ[10,25];
否则dp[i]=dp[i-1]
,
x
i
−
1
x
i
ϵ
[
1
,
10
)
∪
(
25
,
99
]
x_{i-1}x_{i}\epsilon [1,10)\cup\left ( 25,99 \right ]
xi−1xiϵ[1,10)∪(25,99]
第三步:初始状态
dp[0]=dp[1]=1
,即“无数字”和“第1位数字”的翻译方法数量均为1
第四步:返回值
dp[n]
,即此数字的翻译方案数量
代码1——字符串遍历
利用迭代方式编写
class Solution {
public:
int translateNum(int num) {
std::string ans = std::to_string(num);
if (ans.size() < 2) return 1;//特判
std::vector<int> dp(ans.size() + 1);
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= ans.size(); i++) {
std::string temp = ans.substr(i - 2, 2);
if (temp < "10" || temp>"25") dp[i] = dp[i - 1];//不可以翻译
else dp[i] = dp[i - 1] + dp[i - 2];//可以翻译
}
return dp[ans.size()];
}
};
代码2——数字求余
利用递归方式编写
class Solution {
public:
int translateNum(int num) {
return f(num);
}
int f(int num) {
if (num < 10) return 1;
if (num % 100 < 10 || num % 100 > 25) {
return f(num / 10);//不可以翻译
}
else {
return f(num / 10) + f(num / 100);//可以翻译
}
}
};