题目链接:点击查看
题目描述:
已知字母
A-Z
可以表示成数字
1-26
。给定一个数字串,求有多少种不同的字符串等价于这个数字串。
输入输出:
输入:s = "12" 输出:2
输入:s = "226" 输出:3
题目分析:
这是一道很经典的动态规划题,难度不大但是十分考验耐心。这是因为只有
1-26
可以表示字母,因此对于一些特殊情况,比如数字 0
或者当相邻两数字大于
26 时,需要有不同的状态转移方程,详见如下代码。
代码:
int numDecodings(string s)
{
int n=s.length();
if(n==0)
return 0;
int prev=s[0]-'0';
if(!prev)//在此判断第一个数字是否为0 下面代码中用于记录前一个数字字符
return 0;
if(n==1)//字符串长度为1 则数字为1-9之间 此时只有一种解码方式
return 1;
vector<int>dp(n+1,1); //每个数字至少有一种解码方式 除了0(指放在串首单独的零或前面数字大于2)和大于26的数
for(int i=2;i<=n;++i)
{
int cur=s[i-1]-'0';//记录当前的数字字符
if((prev==0||prev>2)&&cur==0)//指00 30 40 50.... 这些情况
{
return 0;
}
if((prev<2&&prev>0)||prev==2&&cur<7)//表示小于26的二位数字的情况 12 16 22 24......
{
if(cur)
{
dp[i]=dp[i-2]+dp[i-1];
}
else//cur为0的情况
{
dp[i]=dp[i-2];
}
}
else//单独大于2数字的情况
{
dp[i]=dp[i-1];
}
prev=cur; //记录前一个数字字符
}
return dp[n];
}