题目
给定一个数字,按照如下规则翻译成字符串: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];
}