問題の説明
数値を指定すると、次のルールに従って文字列に変換されます。0は "a"に変換され、1は "b"に変換されます。...、11は "l"に変換されます。...、25は "z"に変換されます。数値には複数の翻訳がある場合があります。数値が持つ翻訳方法の数を計算する関数をプログラムしてください。
問題解決レポート
示されるnum
第一から1
第二の位置にi
桁変換方法。
最初i
のビットは1として単独で用いてもよく、第二又はi-1
ケースの組み合わせ[ i-1
ビットとi
桁数が範囲[10、25]である必要があります]。
つまり:
、
ok
最初の意味i-1
範囲[10、25]のビットとi番目の桁数を、それが1に比べて、0ではないれています。
特定の実装には、再帰および動的ルールがあります。
実装コード
- 再帰的
class Solution {
public:
int translateNum(int num) {
if(num<10){
return 1;
}
int res=translateNum(num/10),last=num%100;
if(last>=10&&last<=25)
res+=translateNum(num/100);
return res;
}
};
- 動的プログラミング
class Solution{
public:
int translateNum(int num){
string s=to_string(num);
int n=s.size();
vector<int>dp(n+1);
dp[0]=1;
for(int i=1;i<=n;i++){
dp[i]=dp[i-1];
if(i>1){
int t=stoi(s.substr(i-2,2));
if(t>=10&&t<=25){
dp[i]+=dp[i-2];
}
}
}
return dp[n];
}
};