算法
概:一个中等难度的面试题,涉及动态规划内容,然后我就又不会了,我就又看了题解(什么时候我才能正儿八经学会自己用动态规划)
题目
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
来源:力扣(LeetCode)
链接:面试题46_把数字翻译成字符串
示例
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”
思路
- 别问,问就动态规划
- 关于这道题动态规划的规划方程,可以取一个点作为当前读到的最后点,然后去计算读到这个点的最大翻译方法数,我们叫当前点为i,那么其之前一个点就是i-1,如果我们将i独立翻译,那么读到i点的最大翻译方法数就等于i-1的最大翻译方法数,如果i-1和i可以连起来翻译,我们将其连起来翻译,那么读到i点的最大翻译方法数就等于i-2的最大翻译方法数。而如上俩个情况,i独立翻译是没有条件的,但是i-1和i一起翻译存在限制条件,即他们俩的和应该在10和25之间。说白了独立翻译任何条件下都成立,即其最大翻译方法数保底为i-1的最大翻译方法数,如果满足了那个特殊条件,那么其最大翻译方法数可以在保底之上再加上i-2的最大翻译方法数。
- 方程表示:
如果(25>=(10*i-1)+i>=10) :f(i) = f(i-1)+f(i-2)
否则f(i) = f(i-1)
Java代码
public class Solution
{
public int translateNum(int num) {
int r [] = {0,1,1,0}; //上一位数,俩位前的翻译方式,一位前的翻译方式,当前位的翻译方式
int n = 1;
while(num/n>=10)
{
n*=10;
}
while(n>0)
{
if((r[0]*10+num/n)>=10&&(r[0]*10+num/n)<=25)
{
r[3] = r[1]+r[2];
}
else
{
r[3] = r[2];
}
r[0] = num/n;
num -= (num/n)*n;
n/=10;
r[1] = r[2];
r[2] = r[3];
}
return r[3];
}
}