题目:有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。
现在给一串数字,给出有多少种可能的译码结果。
想法:
该题就是动态规划问题,建议在写这题之前明白“背包问题”会好理解很多。
参考代码:
#include<iostream>
using namespace std; int numDecodings(string s)
{
if(!s.size() || s.front() == '') return ;
int r1 = , r2 = ;
for (int i = ; i < s.size(); i++)
{
if (s[i] == '') // 当当前i位为‘0’时,只有与前一位结合在一起算一个字母,即:10,20; 所以,此时r1(最大可能)不增加。
r1 = ; // 这里赋值0,是为了下一个if中r1 = r2 + r1; 将r1赋值为r2.
if ((s[i-] == '') || (s[i-] == '' && s[i] <= ''))
{
r1 = r2+r1; // r1记录的是:第i位算一个字母的情况 + 第i-1位与i位合为一个字母的情况 (也就是最大的可能)
r2 = r1-r2; // r2记录的是:第i-1位之前的所有可能(不包含i-1位)
}
else
r2 = r1;
}
return r1;
}
int main()
{
string s;
while(cin >> s)
{
cout << numDecodings(s) << endl;
}
return ;
}