題目大意:
假設有一規則:’A’ 設爲1,’B’設爲2,以此類推, ‘Z’設爲26。按照這個規則給一串英文字母編碼,將會得到一個數字碼。現在給定這個數字碼,求出可以解碼出多少種不同的英文字母。
解題思路
動態規劃:由於總共有26個英文字母,那麼數字碼可能取1~26。那麼對於每一個數字,這個數字可以單獨解碼,也可以與其前面一個數字一起解碼。則得到的解碼規則如下:
以下每種情況,初始時,結果 = 0。
1. 若數字碼只有一位,結果 = 1。2.若數字碼有兩位,
1> 如果後一個數字在 ‘1’ ~ ‘9’之間,那麼 結果 += 1。
2 >如果這兩個數字組成的數字在 ‘10’ ~ ‘26’ 之間,那麼結果 += 1。3.如果數字碼位數大於3, 假設去掉最後一個數字得到的結果是a,去掉最後兩個數字得到的結果是b,那麼:
— 如果後一個數字在 ‘1’ ~ ‘9’之間,那麼 結果 += a。
— 如果這兩個數字組成的數字在 ‘10’ ~ ‘26’ 之間,那麼結果 += b。
(剛開始的時候,我以爲應該是結果 = 結果(0) + a + 1,和 結果 = 結果 + b + 1。其實不用加1的原因是,在計算a的時候,就已經隱式的將最後一個數字碼看成是單獨一個字母了;同樣在計算b的時候,也已經隱式的將最後兩個數字碼看成是一個字母了。)
最終的代碼如下
#include <iostream>
#include <string>
using namespace std;
string s;
int main(int argc, char const *argv[])
{
while (cin >> s && s[0] != '0')
{
int result[10000] = {1, 1};
int len = s.length();
for (int i = 1; i < len; ++i)
{
if (s[i] >= '1' && s[i] <= '9')
result[i + 1] += result[i];
if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] <= '6')) //last-two-digit is between '10' and '26'
result[i + 1] += result[i - 1];
}
cout << result[len] << endl;
}
return 0;
}