返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++怎么实现解码
  • 737
分享到

C++怎么实现解码

2023-06-20 16:06:34 737人浏览 安东尼
摘要

本篇内容主要讲解“c++怎么实现解码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现解码”吧!解码方法A message containing letters from A

本篇内容主要讲解“c++怎么实现解码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现解码”吧!

解码方法

A message containing letters from A-Z is being encoded to numbers using the following mapping:

'A' -> 1
'B' -> 2
...
'Z' -> 26

Given a non-empty string containing only digits, determine the total number of ways to decode it.

Example 1:

Input: "12"
Output: 2
Explanation: It could be decoded as "AB" (1 2) or "L" (12).

Example 2:

Input: "226"
Output: 3
Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).

这道题要求解码方法,跟之前那道 Climbing Stairs 非常的相似,但是还有一些其他的限制条件,比如说一位数时不能为0,两位数不能大于 26,其十位上的数也不能为0,除去这些限制条件,跟爬梯子基本没啥区别,也勉强算特殊的斐波那契数列,当然需要用动态规划 Dynamci Programming 来解。建立一维 dp 数组,其中 dp[i] 表示s中前i个字符组成的子串的解码方法的个数,长度比输入数组长多多1,并将 dp[0] 初始化为1。现在来找状态转移方程,dp[i] 的值跟之前的状态有着千丝万缕的联系,就拿题目中的例子2来分析吧,当 i=1 时,对应s中的字符是 s[0]='2',只有一种拆分方法,就是2,注意 s[0] 一定不能为0,这样的话无法拆分。当 i=2 时,对应s中的字符是 s[1]='2',由于 s[1] 不为0,那么其可以被单独拆分出来,就可以在之前 dp[i-1] 的每种情况下都加上一个单独的2,这样 dp[i] 至少可以有跟 dp[i-1] 一样多的拆分情况,接下来还要看其能否跟前一个数字拼起来,若拼起来的两位数小于等于26,并且大于等于 10(因为两位数的高位不能是0),那么就可以在之前 dp[i-2] 的每种情况下都加上这个二位数,所以最终 dp[i] = dp[i-1] + dp[i-2],是不是发现跟斐波那契数列的性质吻合了。所以0是个很特殊的存在,若当前位置是0,则一定无法单独拆分出来,即不能加上 dp[i-1],就只能看否跟前一个数字组成大于等于 10 且小于等于 26 的数,能的话可以加上 dp[i-2],否则就只能保持为0了。具体的操作步骤是,在遍历的过程中,对每个数字首先判断其是否为0,若是则将 dp[i] 赋为0,若不是,赋上 dp[i-1] 的值,然后看数组前一位是否存在,如果存在且满足前一位是1,或者和当前位一起组成的两位数不大于 26,则当前 dp[i] 值加上 dp[i - 2]。最终返回 dp 数组的最后一个值即可,代码如下:

C++ 解法一:

class Solution {public:    int numDecodings(string s) {        if (s.empty() || s[0] == '0') return 0;        vector<int> dp(s.size() + 1, 0);        dp[0] = 1;        for (int i = 1; i < dp.size(); ++i) {            dp[i] = (s[i - 1] == '0') ? 0 : dp[i - 1];            if (i > 1 && (s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] <= '6'))) {                dp[i] += dp[i - 2];            }        }        return dp.back();    }};

Java 解法一:

class Solution {    public int numDecodings(String s) {        if (s.isEmpty() || s.charAt(0) == '0') return 0;        int[] dp = new int[s.length() + 1];        dp[0] = 1;        for (int i = 1; i < dp.length; ++i) {            dp[i] = (s.charAt(i - 1) == '0') ? 0 : dp[i - 1];            if (i > 1 && (s.charAt(i - 2) == '1' || (s.charAt(i - 2) == '2' && s.charAt(i - 1) <= '6'))) {                dp[i] += dp[i - 2];            }        }        return dp[s.length()];    }}

下面这种方法跟上面的方法的思路一样,只是写法略有不同:

C++ 解法二:

class Solution {public:    int numDecodings(string s) {        if (s.empty() || s[0] == '0') return 0;        vector<int> dp(s.size() + 1, 0);        dp[0] = 1;        for (int i = 1; i < dp.size(); ++i) {            if (s[i - 1] != '0') dp[i] += dp[i - 1];            if (i >= 2 && s.substr(i - 2, 2) <= "26" && s.substr(i - 2, 2) >= "10") {                dp[i] += dp[i - 2];            }        }        return dp.back();    }};

Java  解法二:

class Solution {    public int numDecodings(String s) {        if (s.isEmpty() || s.charAt(0) == '0') return 0;        int[] dp = new int[s.length() + 1];        dp[0] = 1;        for (int i = 1; i < dp.length; ++i) {            if (s.charAt(i - 1) != '0') dp[i] += dp[i - 1];            if (i >= 2 && (s.substring(i - 2, i).compareTo("10") >= 0 && s.substring(i - 2, i).compareTo("26") <= 0)) {                dp[i] += dp[i - 2];            }        }        return dp[s.length()];    }}

我们再来看一种空间复杂度为 O(1) 的解法,用两个变量 a, b 来分别表示 s[i-1] 和 s[i-2] 的解码方法,然后从 i=1 开始遍历,也就是字符串的第二个字符,判断如果当前字符为 '0',说明当前字符不能单独拆分出来,只能和前一个字符一起,先将 a 赋为0,然后看前面的字符,如果前面的字符是1或者2时,就可以更新 a = a + b,然后 b = a - b,其实 b 赋值为之前的 a,如果不满足这些条件的话,那么 b = a,参见代码如下:

C++ 解法三:

class Solution {public:    int numDecodings(string s) {        if (s.empty() || s[0] == '0') return 0;        int a = 1, b = 1, n = s.size();        for (int i = 1; i < n; ++i) {            if (s[i] == '0') a = 0;            if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] <= '6')) {                a = a + b;                b = a - b;            } else {                b = a;            }        }        return a;    }};

Java 解法三:

class Solution {    public int numDecodings(String s) {        if (s.isEmpty() || s.charAt(0) == '0') return 0;        int a = 1, b = 1, n = s.length();        for (int i = 1; i < n; ++i) {            if (s.charAt(i) == '0') a = 0;            if (s.charAt(i - 1) == '1' || (s.charAt(i - 1) == '2' && s.charAt(i) <= '6')) {                a = a + b;                b = a - b;            } else {                b = a;            }        }        return a;    }}

到此,相信大家对“C++怎么实现解码”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: C++怎么实现解码

本文链接: https://lsjlt.com/news/298413.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++怎么实现解码
    本篇内容主要讲解“C++怎么实现解码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现解码”吧!解码方法A message containing letters from A...
    99+
    2023-06-20
  • c语言中怎么实现qp编解码
    本篇文章给大家分享的是有关c语言中怎么实现qp编解码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 void DecodeQP(ngx_str_t *des...
    99+
    2023-06-04
  • C#Unicode编码解码的实现
    Unicode是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制...
    99+
    2024-04-02
  • C++代码调用C#代码的过程怎么实现
    这篇文章主要讲解了“C++代码调用C#代码的过程怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++代码调用C#代码的过程怎么实现”吧!首先建立一个C#工程Class Library...
    99+
    2023-06-17
  • C# Unicode编码解码如何实现
    本文小编为大家详细介绍“C# Unicode编码解码如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C# Unicode编码解码如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。U...
    99+
    2023-07-02
  • C#中怎么实现代码延时
    本篇文章给大家分享的是有关C#中怎么实现代码延时,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Task.Delay();异步实现using System;using&...
    99+
    2023-06-20
  • C++中怎么实现算术编码
    C++中怎么实现算术编码,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C++算术编码需要输入的是符号,各个符号的概率还有需要编码的符号序列,根据概率可以算出初始编码间隔,先设几...
    99+
    2023-06-17
  • C++实现LeetCode(91.解码方法)
    [LeetCode] 91. Decode Ways 解码方法 A message containing letters from A-Z is being en...
    99+
    2024-04-02
  • C++链栈的实现代码怎么写
    这篇文章主要讲解了“C++链栈的实现代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++链栈的实现代码怎么写”吧!链栈简述链栈从概念上看是链表和栈的结合,含有栈先进后出的特性,也具...
    99+
    2023-07-02
  • C#实现Base64编码与解码及规则
    一、编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24 位数据,再把这24位...
    99+
    2024-04-02
  • C++代码实现链队列详解
    目录主要功能:完整代码展示:总结主要功能: 初始化、入队、出队、取队头元素、销毁队列、输出队列 完整代码展示: #include <iostream> using n...
    99+
    2024-04-02
  • C#中怎么实现打印条码操作
    本篇文章为大家展示了C#中怎么实现打印条码操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#打印条码操作的实例:using System;   using...
    99+
    2023-06-17
  • C语言实现扫雷代码怎么写
    这篇文章主要介绍了C语言实现扫雷代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言实现扫雷代码怎么写文章都会有所收获,下面我们一起来看看吧。C语言实现扫雷OvO0.打印菜单void men...
    99+
    2023-06-29
  • 怎么用C++代码实现马踏棋盘
    这篇文章主要讲解了“怎么用C++代码实现马踏棋盘”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用C++代码实现马踏棋盘”吧!(一)马踏棋盘经典算法描述:  (1)马踏棋盘是经典...
    99+
    2023-06-29
  • php怎么实现Base64的编码和解码
    Base64算法是一种将二进制数据转换为ASCII字符的编码方式,使得数据可以在传输过程中不被修改或损坏,同时也可以隐藏数据的真实内容。在PHP中,可以利用内置函数或手动编写代码实现Base64的编码和解码。PHP内置函数的使用PHP中提供...
    99+
    2023-05-14
    Base64 php
  • Java怎么实现UTF-8编码与解码
    这篇文章主要介绍了Java怎么实现UTF-8编码与解码的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么实现UTF-8编码与解码文章都会有所收获,下面我们一起来看看吧。Java实现UTF-8编码与解码J...
    99+
    2023-07-06
  • C/C++实现蛇形矩阵的示例代码怎么写
    这篇文章将为大家详细讲解有关C/C++实现蛇形矩阵的示例代码怎么写,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。菜鸡蒟蒻想在博客中记录一些算法学习的心得体会,会持续更新C/C++方面的题解,...
    99+
    2023-06-26
  • C/C++实现HTTP协议解析的示例代码
    超文本传输协议 (HTTP) 是分布式、协作、超媒体信息系统的应用层协议。 这是自 1990 年以来万维网数据通信的基础。HTTP 是一种通用且无状态的协议,它可以用于其他目的,也可...
    99+
    2024-04-02
  • C++ffmpeg硬件解码的实现方法
    目录什么是硬件解码为什么要使用硬件解码怎样使用硬件解码注意事项关键函数解析什么是硬件解码 普通解码是利用cpu去解码也就是软件解码 硬件解码就是利用gpu去解码 为什么要使用硬件解码...
    99+
    2024-04-02
  • C语言怎么实现密码输入功能
    在C语言中,可以使用`getpass()`函数实现密码输入功能。`getpass()`函数定义在``头文件中。以下是一个示例代码:`...
    99+
    2023-08-31
    C语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作