題目鏈接:數字翻譯成字符串
題目描述:
給定一個數字,我們按照如下規則把它翻譯爲字符串:0 翻譯成 “a” ,1 翻譯成 “b”,……,11 翻譯成 “l”,……,25 翻譯成 “z”。一個數字可能有多個翻譯。請編程實現一個函數,用來計算一個數字有多少種不同的翻譯方法。
示例 1:
輸入: 12258
輸出: 5
解釋: 12258有5種不同的翻譯,分別是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”
題目分析:和之前的打家劫舍有些相似。由於題目最大數字爲25,是一個兩位數,那麼將數字進行拆分求解組合時“
如果是一位數,沒有任何限制,但是如果是一個兩位數,就需要判斷是否是一個合法的數字,合法才能算爲一個方案,不難看出,合法的範圍爲[10-25],此外,0X的形式也是不合法的。
我們用dp[i]表示到數字i爲止的方案數目,如果i與i-1的組成的兩位數是合法的,方案累加,否則仍舊繼承i-1的方案數
代碼:
class Solution {
public int translateNum(int num) {
String s = String.valueOf(num);
int n = s.length();
int[] dp = new int[n+1];
dp[0]=dp[1] = 1;
for(int i = 2;i <= n;i++){
String te = s.substring(i-2,i);
if(te.compareTo("10")>=0&&te.compareTo("25")<=0) dp[i] = dp[i-1]+dp[i-2];
else dp[i] = dp[i-1];
}
return dp[n];
}
}
優化:一維的遞推數組我們可以使用臨時變量的方法來進行空間優化
class Solution {
public int translateNum(int num) {
String s = String.valueOf(num);
int n = s.length();
int a = 1,b = 1,c = 0;
for(int i = 2;i <= n;i++){
String te = s.substring(i-2,i);
c = te.compareTo("10") >= 0 && te.compareTo("25") <= 0 ? a + b : a;
b = a;
a = c;
}
return a;
}
}
更進一步,我們還可以把字符串s去掉,直接在num上進行處理,對某個數值要取得特定位數的數字,一般通過
對10的冪做整除與取餘運算