【算法題】輸入一串數字,判斷有多少種字母組合方式

題目

輸入一個十進制的數組,假設數字分別對應一個英文字母,求問一串十進制數字一共有多少分割方式能輸出不同的英文字母串。

輸入爲一個數組,數組內的每個元素都在[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:保存中間結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章