假设1到26之间的26个数据,可以编码为对应的’A'-’B',对于一个给定的数字字符串,可以有多少种编码方式?假定输入都是合法的(不会有”30″)。
输出: 3
// "ABA", "AU", "LA"
输入: digits[] = "1234"
输出: 3
举例:
输入: digits[] = "121"输出: 3
// "ABA", "AU", "LA"
输入: digits[] = "1234"
输出: 3
// "ABCD", "LCD", "AWD"
动态规划:
#include <iostream>
#include <string>
using namespace std;
int CountDecodingDp(string str)
{
int len = str.size();
int* DP = new int[len + 1];//DP[i+1]表示字符串str[0]....str[i]的最大编码个数
DP[0] = 1;
DP[1] = 1;//如果只有str[0]一个字符
//注意DP[i+1]对应str[i],依次递增
for (int i = 1; i < len; i++)
{
if (str[i] == '0')
DP[i + 1] = DP[i - 2];
else if (str[i] <= '6')
{
if (str[i - 1] == '1' || str[i - 1] == '2')
{
DP[i + 1] = DP[i];
DP[i + 1] += DP[i - 1];
}
else
DP[i + 1] = DP[i];
}
else
{
if (str[i - 1] == '1')
{
DP[i + 1] = DP[i];
DP[i + 1] += DP[i - 1];
}
else
DP[i + 1] = DP[i];
}
}
int ans = DP[len];
delete[]DP;
return ans;
}
int main()
{
string str = "121";
cout << CountDecodingDp(str) << endl;
return 0;
}