題目
給定一個數字,按照如下規則翻譯成字符串: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];
}