【力扣刷题】解码方法😎
😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!
😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
前言🙌
哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘 都是精华内容,可不要错过哟!!!😍😍😍
91. 解码方法
题目链接: 解码方法
解题思路:
- 本题采用的是动态规划的解法。首先构建根据状态表示构建一个dp数组,为了防止越界需要对dp【0】,dp【1】做初始化。根据状态表示和题目要求得出状态方程,最后将结果返回即可
- 该解法的时间复杂度O(n),空间复杂度为O(n)。
解题源码分享:
cpp
class Solution {
public:
int numDecodings(string s)
{
// //1.创建dp【】
// int len = s.size();
// vector<int> dp(len);//dp[i]:已i位置为结尾时,解码的总数
// //初始化
// dp[0] = s[0] != '0';
// if(len == 1) return dp[0];
// int t = (s[0] - '0') * 10 + s[1] - '0';
// if(t >= 10 && t <= 26) dp[1] += 1;//两个结合编码成功
// if(s[0] != '0' && s[1] != '0') dp[1] += 1;//单独编码成功
// for(int i = 2; i < len; i++)
// {
// //单独编码成功
// if(s[i] != '0') dp[i] += dp[i - 1];
// int t = (s[i - 1] - '0') * 10 + s[i] - '0';
// if(t >= 10 && t <= 26) dp[i] += dp[i - 2];//两个结合编码成功
// }
// return dp[len - 1];
//1.创建dp【】
int len = s.size();
vector<int> dp(len + 1);//dp[i]:已i位置为结尾时,解码的总数
//初始化
dp[0] = 1;
dp[1] = s[0] != '0' ;
if(len == 1) return dp[1];
for(int i = 2; i <= len; i++)
{
//单独编码成功
if(s[i - 1] != '0') dp[i] += dp[i - 1];
int t = (s[i - 2] - '0') * 10 + s[i - 1] - '0';
if(t >= 10 && t <= 26) dp[i] += dp[i - 2];//两个结合编码成功
}
return dp[len];
}
};
运行结果截图:
总结撒花💞
希望大家通过阅读此文有所收获!
😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘