【剑指 Offer 题解】46. 把数字翻译成字符串

题目

给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。

思路

在这里插入图片描述

  • dp[i] 表示从第i个数字开始,翻译方法的个数
  • 如果第i位和i+1位拼起来的数字大于25,第i位只能单独成一个字母, dp[i] = dp[i + 1]
  • 如果第i位和i+1位拼起来的数字在10-25范围内,第i位可以单独成一个字母,也可以和第i+1位组合成一个字母,dp[i] = dp[i + 1] + dp[i + 2]
  • 初始值:
  • (1)dp[n] = 1
  • (2)如果第n位和n-1位拼起来的数字大于25,dp[n - 1] = 1
  • (3)如果第n位和n -1位拼起来的数字在10-25范围内,dp[n - 1] = 2
public static int numDecodings(String s) {
	char[] chars = s.toCharArray();
	int n = chars.length;
	int[] dp = new int[n];
	dp[n - 1] = 1;
	int num = (chars[n - 2] - '0') * 10 + (chars[n - 1] - '0');
	dp[n - 2] = num > 25 ? 1 : 2;
	for (int i = n - 3; i >= 0; i--) {
		num = (chars[i] - '0') * 10 + (chars[i + 1] - '0');
		dp[i] = dp[i + 1] + (num > 25 ? 0 : dp[i + 2]);
	}
	return dp[0];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值