記事のディレクトリ
46が刻まれて:デジタル文字列に変換します
一つ、タイトル説明
0「」、「B」に翻訳1、......、「L」に翻訳11、...、25が「Z」に翻訳翻訳:デジタル与え、我々は、文字列を変換するには、次の規則に従います。デジタル変換よりもあるかもしれません。たとえば12258について "bccfi"、 "BWFI"、 "bczi"、 "mcfi" と "MZI" 5本の異なる翻訳があります。数持って翻訳を計算するための多数の異なる方法のための機能をプログラミングしてください。
第二に、問題分析
ブラシブラシ多くの質問は、私は第一印象のこの質問は、再帰を用いて処理することができます参照してください。
関係で私たちは最初の一見:
fの(i)が異なる翻訳の数から発現される私はあなたがそこに着くことができ、開始ビット:F(I)= F(I + 1)+ G(I、I + 1)* F (I + 2) 。
IとI + 1桁は(iは、iが10〜25グラムの範囲でまとめ 1 +) そうでなければ1、及び0です。
繰り返しサブ問題の存在は、再帰が最善の方法ではありませんので、我々は数の終わりからF(I)に開始し、ボトムアップの問題解決には、重複した部分問題を解消することができます。最初のカウントF(LEN-1)、F(LEN-2)、次いで式f(I)に従う= F(I + 1)+ G(I + 1)* F(I + 2)前方に徐々に由来最終的な要件の結果である、(0)からf。
第三に、この問題は解決され
カウント[](Fとしての役割を果たす)
public int getTranslationCount(int number) {
if(number<0) {
return 0;
}
String sNumber=String.valueOf(number);
int len=sNumber.length();
int[] counts=new int[len];
for(int i=len-1;i>=0;i--) {
if(i==len-1) {
counts[i]=1;
} else {
counts[i]=counts[i+1];
if(canBeTrans(sNumber,i)) {
if(i==len-2) {
counts[i]+=1;
} else {
counts[i]+=counts[i+2];
}
}
}
}
return counts[0];
}
private boolean canBeTrans(String sNumber, int i) {
int a=sNumber.charAt(i)-'0';
int b=sNumber.charAt(i+1)-'0';
int convert=a*10+b;
return convert >= 10 && convert <= 25;
}