[算法练习及思路-leetcode剑指offer(Java解法)]No46.把数字翻译成字符串

134 篇文章 1 订阅
114 篇文章 0 订阅

题号:剑指 Offer 46

题目名:把数字翻译成字符串
原题URL:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/
题目描述

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

示例

示例 1:

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

限制
  • 0 <= num < 231
思路

1.动态规划,i位置的拼凑方式是和i-1相关的,如果能和i-1位置合起来拼,那就是dp[i]=dp[i-1]+dp[i-2],否则就是他自己dp[i]=dp[i-1]

解题代码
class Solution {
    public int translateNum(int num) {
        //每个字符串有可能自己作为一种翻译,他也可能和前面一个字符形成联合翻译,动态规划解决
        //dp[i]表示第i个位置有的翻译方式,可能是他自己一个翻译方式,也有可能是和前面一个字符凑成一种翻译方式
        //状态转移方程为dp[i]=dp[i-1]或者dp[i]=dp[i-1]+dp[i-2]
        List<Integer> list = new ArrayList<>();
        while (num>0) {
            list.add(0,num%10);
            num/=10;
        }
        if(list.size()<=1) return 1;
        int[] dp = new int[list.size()+1];
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i < dp.length; i++) {
            dp[i] = dp[i-1];
            if(list.get(i-2)==1||(list.get(i-2)==2&&list.get(i-1)>=0&&list.get(i-1)<=5)) dp[i] += dp[i-2];
        }
        return dp[list.size()];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值