【劍指 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];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章