題目
輸入一個十進制的數組,假設數字分別對應一個英文字母,求問一串十進制數字一共有多少分割方式能輸出不同的英文字母串。
輸入爲一個數組,數組內的每個元素都在[1, 9]之間
輸出爲一個數字,表示輸出的可能。
示例
樣例1
輸入:[1, 2]
輸出:2
可能產生的串:
1 | 2 => a, b
12 => l
樣例2
輸入:[1, 1, 1]
輸出:3
可能產生的串:
1 | 1 | 1 => a, a
1 | 11 => a, k
11 | 1 => k, a
思路
很明顯這個問題可以不斷的被分解爲一個個小問題,小問題的輸出相加最後成爲大問題的結果。這樣看來可以考慮遞歸的解法
f(n) = f(n - 1) + f(n - 2)
f(n)代表輸入數組長度爲
遞歸退出條件:
n == 2:
如果大於26輸出1,否則返回2
n == 1:
返回1
n == 0:
返回0
解法
遞歸
private long run(int[] data) {
if (data.length == 2) {
if (data[0] * 10 + data[1] <= 26) {
return 2;
} else {
return 1;
}
}
if (data.length == 1) {
return 1;
}
if (data.length == 0) {
return 0;
}
long result = 0;
if (data[0] * 10 + data[1] <= 26) {
result += run(Arrays.copyOfRange(data, 2, data.length));
}
return result + run(Arrays.copyOfRange(data, 1, data.length));
}
動態規劃
tip:保存中間結果