算法练习-动态规划 LeetCode 剑指 Offer 46. 把数字翻译成字符串

博客详细介绍了如何使用动态规划解决LeetCode上的剑指Offer46问题,即计算数字翻译成字符串的不同方法数。解题思路涉及斐波那契数列,并通过代码展示了如何处理满足10~25条件的数字组合,动态更新状态以求解。
摘要由CSDN通过智能技术生成

今日心情:就....就什么都不会😓😓

题目描述:

 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。


小结:

对于动态规划问题:主要就是找到动态转移方程,如何更新,以及如何将实际问题抽象出这样的动态解决方案进行解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值