Leetcode--91. 解码方法
单独字符:每个1到9的数字都可以单独作为一个字符解码。 两位数组成的字符:两位数组成的数字必须在10到26之间,且第一位不能为0。 当前字符作为单独字符解码。 当前字符和前一个字符组成两位数解码。 初始化:创建一个长度为字符串长度+1的dp数组,dp[0]=1表示空字符串的解码方法数。 遍历字符串:从第一个字符开始遍历。 单独字符解码:如果当前字符不是0,则将dp[i] += dp[i-1]。 两位数解码:如果当前位置允许组成两位数(i>=2),检查两位数组成的数字是否在10到26之间,且第一位不是0。如果满足条件,dp[i] += dp[i-2]。 返回结果:dp数组的最后一个元素即为所有解码方法的总数。
发布日期:2021-04-30 21:00:12
浏览次数:242
分类:精选文章
本文共 1156 字,大约阅读时间需要 3 分钟。
解码方法的总数可以通过动态规划来高效计算。具体来说,我们需要解决一个字符串解码问题,其中每个字符可以表示为1到26的数字。给定一个只包含数字的字符串,我们需要计算它可以以多少种方式被解码。
问题分析
我们可以将每个字符转换为对应的字母。例如,数字1对应'A',数字2对应'B',直到数字26对应'Z'。解码方法分为两种情况:单独的字符和两位数组成的字符。
动态规划思路
我们可以使用动态规划来解决这个问题。设dp[i]表示前i个字符的解码方法数。初始化dp[0]=1,因为空字符串有1种解码方式。
对于每个位置i,我们需要考虑两种解码方式:
解决代码
class Solution { public int numDecodings(String s) { int[] dp = new int[s.length() + 1]; dp[0] = 1; for (int i = 1; i <= s.length(); i++) { if (s.charAt(i-1) != '0') { dp[i] += dp[i-1]; } if (i >= 2) { int num = (s.charAt(i-2) - '0') * 10 + (s.charAt(i-1) - '0'); if (num <= 26 && s.charAt(i-2) != '0') { dp[i] += dp[i-2]; } } } return dp[s.length()]; }} 代码解释
这个方法通过记录每一步的解码方法数,避免了重复计算,时间复杂度为O(n),空间复杂度为O(n)。
发表评论
最新留言
表示我来过!
[***.240.166.169]2026年05月26日 23时01分43秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Parallel.ForEach的基础使用
2023-02-26
Path形状获取字符串型变量数据
2023-02-26
PAT甲级——1007 Maximum Subsequence Sum (25分)
2023-02-26
PayPal网站付款标准版(for PHP)
2023-02-26
Paystack Android SDK 集成与使用指南
2023-02-26
PC端编辑 但能在PC端模拟移动端预览的富文本编辑器
2023-02-26
PDF中的Pandoc语法突出显示不起作用
2023-02-26
pdf做成翻页电子书_第一弹:常见BOOX电子书阅读器问题解答,这些技能你都会吗?...
2023-02-26
PDF文字识/编辑?这个工具真的很强大!
2023-02-26
pdf文档出现乱码如何修改
2023-02-26
PDO中捕获SQL语句中的错误
2023-02-27
percona-xtrabackup 备份
2023-02-27
Perl的基本語法
2023-02-27
perl输出中文有乱码
2023-02-27
php -- 魔术方法 之 判断属性是否存在或为空:__isset()
2023-02-27
php -树-二叉树的实现
2023-02-27
php csv 导出
2023-02-27
PHP imap 远程命令执行漏洞复现(CVE-2018-19518)
2023-02-27