题目
输入一个十进制的数组,假设数字分别对应一个英文字母,求问一串十进制数字一共有多少分割方式能输出不同的英文字母串。
输入为一个数组,数组内的每个元素都在[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:保存中间结果