題目
給定一個數字,按照如下規則翻譯成字符串:
0->a
1->b
...
25->z
因此一個數字可能有多種翻譯。例如,12258有5種不同的翻譯,bccfi,bwfi,bczi,mcfi,mzi。
請實現一個函數,計算數字有多少種翻譯方法。
思路
可以用遞歸解決,會發現子問題258 58都重復了。

自然想到可以用動態規划來解決,用f(i)來表示從第i位數字開始不同的翻譯數目,
我們可以寫出轉移矩陣

g(i,i+1)表示第i位和i+1位拼起來的數字在10~25范圍內,值為1,否則為0。
先f(5) = 1, f(4) = 1
f(3) = f(4) + 0 = 1
f(2) = f(3) + f(4) = 2
f(1) = f(2) + f(3) = 3
f(0) = f(1) + f(2) = 5
int GetTranslationCount(int number){ if (number < 0) return 0; string numberString = to_string(number); return GetTranslationCount(numberString); } int GetTranslationCount(const string& number){ int length = number.length(); int* f = new int[length]; int count = 0; for (int i = length - 1; i >= 0; i++){ count = 0; i < length - 1 ? count = f[i + 1] : count = 1; if (i < length - 1) { int digit1 = number[i] - '0'; int digit2 = number[i + 1] - '0'; int converted = digit1 * 10 + digit2; if (converted >= 10 && converted <= 25){ i < length - 2 ? count += f[i + 2] : count += 1; } } f[i] = count; } count = f[0]; delete[] f; return count; }
