トピック:
デジタル考えると、我々はそれを文字列に変換するために、次の規則に従ってください:0、1、Bに翻訳...... 25のzに翻訳に翻訳します。デジタル変換よりもあるかもしれません。例えば、5つの異なる12258翻訳、すなわち「bccfi」、「BWFI」、「bczi」、「mcfi」と「MZI」があり、多くの異なる翻訳方法は番号を持っているか計算するための機能を実装してください。
分析:
12258翻訳プロセスの私達のケーススタディ。オプション1つのオプション2及び数の数、Bに対応し、そしてM:ときに最初の翻訳は、2つの選択肢があります。後者は、変換プロセス中に見出すことができる翻訳のためのサブストリング12258とみなすことができ、翻訳プロセスは再帰的プロセスであり、依然として同じです。
我々は、前記関数f(i)は、次に(I)= F(I + 1)+ G(I、I + 1)×F(I + 2)F、としてi番目の桁は異なる翻訳の数を示す定義しますG(I、I + 1)、G 1でない場合であれば、i番目のビットとI + 1ビットのデジタルスプライスGは、(i、i + 1)に、10と25との間に示されていません(I、I + 1)0です。
分析を通じて、再帰は、この問題に対する最善の解決策ではありませんので、再帰は私たちから、最も子供の問題から分析を開始するために使用することができ、トップダウン、ボトムアップアプローチである、再帰的にサブ問題が繰り返されます右端、はるかに停止するまで残って分析を開始。
ソリューション:
package com.wsy;
public class Main {
public static void main(String[] args) {
int number = 12258;
char[] chars = String.valueOf(number).toCharArray();
getTranslateCount(chars);
}
public static void getTranslateCount(char[] chars) {
int length = chars.length;
int[] counts = new int[length + 1];// length+1防止越界
for (int i = length - 1; i >= 0; i--) {
if (i == length - 1) {
counts[i] = 1;
} else {
counts[i] = counts[i + 1] + g(i, chars) * counts[i + 2];
}
}
System.out.println("翻译方法有:" + counts[0] + "种");
}
public static int g(int index, char[] chars) {
int number = Integer.parseInt("" + chars[index] + chars[index + 1]);
return number >= 10 && number <= 25 ? 1 : 0;
}
}