标签:third int 解码 else second 方法 dp first
解码方法
要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:
“AAJF” ,将消息分组为 (1 1 10 6)
“KJF” ,将消息分组为 (11 10 6)
题目链接
1.动态规划分析求解
class Solution {
public:
int numDecodings(string s) {
if(s.size()==0||s[0]=='0')
return 0;
//最少有一个元素,且第一个元素不为0
vector<int> dp(s.size(),0);
dp[0]=1;
for(int i=1;i<s.size();i++)
{
if(s[i]=='0')//只能与前面进行组合
{
if(s[i-1]>'2'||s[i-1]=='0')//不能进行组合
return 0;
if(i>=2)
dp[i]=dp[i-2];
else
dp[i]=1;//第二个元素为0
}
else//s[i]!=0
{
if(s[i-1]=='1')//前面为1,
{
if(i-2>=0)
dp[i]=dp[i-1]+dp[i-2];
else
dp[i]=2;//当前为第二个元素
}
else if(s[i-1]=='2'&&s[i]<='6')//前面为2
{
if(i-2>=0)
dp[i]=dp[i-1]+dp[i-2];
else
dp[i]=2;
}
else
dp[i]=dp[i-1];
}
}
return dp[s.size()-1];
}
};
2.空间复杂度优化
上述代码之中,空间复杂度为O(N),由代码可知,dp[i]只与dp[i-1]和dp[i-2]有关系,因此可以定义三个变量来保存这三个值,使空间复杂度降为O(1)
class Solution {
public:
int numDecodings(string s) {
if(s.size()==0||s[0]=='0')
return 0;
//dp[i]=dp[i-1]+dp[i-2];
int first=1;
int second=1;
int third=first;
for(int i=1;i<s.size();i++)
{
if(s[i]=='0')
{
if(s[i-1]=='0'||s[i-1]>'2')
return 0;
else
{
third=second;
second=first;
first=third;
}
}
else//s[i]!+'0'
{
if(s[i-1]=='1')
{
third=first+second;
second=first;
first=third;
}
else if(s[i-1]=='2'&&s[i]<='6')
{
third=first+second;
second=first;
first=third;
}
else
{
third=first;
second=first;
first=second;
}
}
}
return third;
}
};
标签:third,int,解码,else,second,方法,dp,first 来源: https://blog.csdn.net/ych9527/article/details/116298134
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。