この質問について、私の最初のアイデアは再帰でしたが、順列と組み合わせに関しては、良い方法を考えることができないと感じています。答えの公式を持った後でも、直接配置して組み合わせて結果を得るのは簡単ではありません。
答えを読んだ後、答えは式を与えます
f(i)= f(i + 1)+ g(i、i + 1)* f(i + 2)、ここでf(i)は数値iで始まる型の数を表し、gはiの場合を表します。 i + 1は26未満の数に組み合わせることができ、それから1になり、それ以外の場合は0になります。このような再帰はすべてのケースを計算できますが、サブ問題が繰り返されます。したがって、右から左に翻訳し、さまざまな翻訳の数を数えて、問題を下から上に解決します。
下から上に移動するときは、最初に最後の計算を計算します。これは、前の計算が後の要素の計算結果に依存するため、結果を保存する配列を下から上に実現できるためです。
回答コード
public int translateNum(int num) {
String num_s = num + "";
char[] num_c = num_s.toCharArray();
int[] time_num = new int[num_c.length];
for(int count = num_c.length -1;count>=0;count--){
if(count == num_c.length -1){
time_num[count] = 1;
}else{
time_num[count] = time_num[count+1];
}
if(count + 1 <num_c.length){
int dig1 = num_c[count] - '0';
int dig2 = num_c[count+1] - '0';
if(dig1*10 + dig2 <=25 && dig1*10 + dig2 >= 10){
if(count < num_c.length - 2){
time_num[count] += time_num[count + 2];
}else{
time_num[count] += 1;
}
}
}
}
return time_num[0];
}