今日心情:就....就什么都不会😓😓
题目描述:
LeetCode 剑指 Offer 46. 把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
解题代码:
class Solution {
public int translateNum(int num) {
String s = String.valueOf(num);
int a = 1; // f(0) =1
int b = 1; // f(1) =1
for(int i = 2;i<= s.length();i++){
String temp = s.substring(i-2,i);
int c = temp.compareTo("10") >= 0 && temp.compareTo("25") <= 0 ? a+b:b;
a = b;
b = c;
}
return b;
}
}
解题思路:(直接看的leetcode题解思路+自己的理解)
(1)和青蛙🐸跳台阶差不多,即 斐波那契数列 ,只是对于最后一步,是两个数还是一个数可以翻译做了限制条件,对于两个数大于10且小于25才有两个数可以翻译成一个字符的情况,所以在最后两个数组合满足10~25的条件,组合翻译方法有 f(i-1) + f(i-2) , 如果不满足则只有 f(i-1)种方法。
(2)起始条件 a 代表f (0) 情况 1种方法,b代表f(1)情况代表1种方法。
(3)从2开始循环遍历,因为f(0)和f(1)为初始情况已经考虑。每次判断最后两个字符数字,通过String temp = s.substring(i-2,i); 然后判断最后两个字符数字是否满足组合翻译的条件,如果满足则 方法数更新为 f(i-1) + f(i-2) 即 a+b, 否则只等于 f(i-1)即 b。
(4)动态更新 : 将 a = b; 即 f(i-2) 更新为 f(i-1); b = c 将 f(i-1)更新为 f(i) , 最后返回 b。
小结:
对于动态规划问题:主要就是找到动态转移方程,如何更新,以及如何将实际问题抽象出这样的动态解决方案进行解决。