[LeetCode]剑指 Offer 46. 把数字翻译成字符串
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]剑指 Offer 46. 把数字翻译成字符串相关的知识,希望对你有一定的参考价值。
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”
提示:
- 0 <= num < 231
题解:
递推公式:
动态规划解析:记数字 num 第 i 位数字为 xi,数字 num 的位数为 n。例如: num = 12258 时 n = 5, x1 = 1
- 设动态规划列表 dp,dp[i] 代表以 xi 结尾的数字的翻译方案数量
- 转移方程: 若 xi 和 xi-1 组成的两位数字可以被翻译,则
dp[i] = dp[i−1] + dp[i−2]
,否则dp[i] = dp[i-1]
- 可被翻译的两位数区间为 [10, 25]
- 初始状态:
dp[0] = dp[1] = 1
,即 “无数字” 和 “第 1 位数字” 的翻译方法数量均为 1 - 返回值:
dp[n]
,即此数字的翻译方案数量
/**
* 剑指 Offer 46. 把数字翻译成字符串
*/
public int translateNum(int num)
String s = String.valueOf(num);
int sum = 1;
int pre = 1;
for (int i = 2; i <= s.length(); i++)
String tmp = s.substring(i - 2, i);
// 若 xi 和 xi-1 组成的两位数字可以被翻译,则 dp[i] = dp[i−1] + dp[i−2],否则 dp[i] = dp[i-1]
int cur = tmp.compareTo("10") >= 0 && tmp.compareTo("25") <= 0 ? sum + pre : sum;
pre = sum;
sum = cur;
return sum;
/**
* 剑指 Offer 46. 把数字翻译成字符串
*/
public int translateNum(int num)
int sum = 1;
int pre = 1;
int x;
int y = num % 10;
while(num != 0)
num /= 10;
x = num % 10;
int digit = 10 * x + y;
int cur = (digit >= 10 && digit <= 25) ? sum + pre : sum;
pre = sum;
sum = cur;
y = x;
return sum;
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof
以上是关于[LeetCode]剑指 Offer 46. 把数字翻译成字符串的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode1442. 形成两个异或相等数组的三元组数目 / 剑指 Offer 46. 把数字翻译成字符串 / 剑指 Offer 47. 礼物的最大价值
LeetCode剑指offer46把数字翻译成字符串(动态规划)
[LeetCode]剑指 Offer 46. 把数字翻译成字符串