91. 解码方法 ——【Leetcode每日刷题】
创始人
2024-05-31 11:54:32
0

91. 解码方法

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :

‘A’ -> “1”
‘B’ -> “2”

‘Z’ -> “26”

解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:

“AAJF” ,将消息分组为 (1 1 10 6)
“KJF” ,将消息分组为 (11 10 6)
注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06” 在映射中并不等价。

给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。

题目数据保证答案肯定是一个 32 位 的整数。

示例 1:

输入:s = “12”
输出:2
解释:它可以解码为 “AB”(1 2)或者 “L”(12)。

示例 2:

输入:s = “226”
输出:3
解释:它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。

示例 3:

输入:s = “06”
输出:0
解释:“06” 无法映射到 “F” ,因为存在前导零(“6” 和 “06” 并不等价)。

提示:

  • 1 <= s.length <= 100
  • s 只包含数字,并且可能包含前导零。

思路:(动态规划)

这道题不要往复杂了想,其实一共就是两种情况,一次解码一个字符和一次解码两个字符,dp[i] 就等于这两种情况之和。

dp数组的含义,dp[i] 为前 i 个子字符串 (即从 0 ~ i-1) 一共有多少种编码方式。

递推公式为:
dp[i]=dp[i−1]+dp[i−2]dp[i] = dp[i - 1] + dp[i - 2]dp[i]=dp[i−1]+dp[i−2]

特别需要注意的是:

  1. 如果 s[i] = 0 ,不能单独解码,只能和前一个组合解码,前一个 s[i-1] 必须是 1 或者 2,否则超出范围无法解码。
    • 如果可以前一个字符s[i-1]组合解码,则s[i-1]就不能和s[i-2]在组合了,此时:dp[i] = dp[i -2];
    • 如果不能组合解码,则该字符串无法解码。
  2. 如果 s[i] 不为0,则肯定可以单独解码,能否组合解码,还要判断组合码是否超出边界,或者无法映射。
    • 如果 s[i] 可以组合解码则: dp[i] = dp[i - 1] + dp[i - 2] ;
    • 不能组合解码则: dp[i] = dp[i - 1] 。

代码:(Java)

public class DecodingWays {public static void main(String[] args) {// TODO Auto-generated method stubString s = "226";System.out.println(numDecodings(s));}public static int numDecodings(String s) {int n = s.length();if(s.charAt(0) == '0')return 0;int []dp = new int[n + 1];dp[0] = dp[1] = 1;for(int i = 1; i < n; i++) {if(s.charAt(i) == '0' && (s.charAt(i - 1) == '1' || s.charAt(i - 1) == '2')) {dp[i + 1] = dp[i - 1];}else if(s.charAt(i) == '0') {return 0;}else if(Integer.valueOf(s.substring(i - 1,i + 1)) < 27 && Integer.valueOf(s.substring(i - 1,i + 1)) > 10) {dp[i + 1] = dp[i] + dp[i - 1];}else {dp[i + 1] = dp[i];}}return dp[n];}
}

运行结果:

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串 s 的长度。

  • 空间复杂度:O(n)。使用数组进行状态转移,其中 n 是字符串 s 的长度;

注:仅供学习参考!

题目来源:力扣。

相关内容

热门资讯

安卓类原生系统下载方法,安卓原... 你有没有想过,为什么你的手机总是那么卡,那么慢?是不是因为它的系统太老了,需要更新一下呢?别急,今天...
安卓系统车机界面,智能驾驶体验... 你有没有发现,现在越来越多的汽车都开始搭载智能系统了?没错,就是那种可以连接手机、导航、娱乐一应俱全...
神器系统和安卓内存对比,性能与... 你有没有想过,为什么你的手机有时候会卡得像蜗牛一样?其实,这背后有一个神秘的大脑在默默操控着——那就...
鸿蒙系统版本安卓版区别,安卓版... 你有没有发现,最近手机圈子里有个大热门,那就是鸿蒙系统。没错,就是那个华为自主研发的系统。不过,你知...
韶关安卓系统广告机,智能展示新... 韶关安卓系统广告机:点亮城市繁华的智慧之光想象当你走在韶关的街头,突然间,一块块屏幕如同魔法般亮起,...
安卓系统收据怎么开启,实际应用... 你有没有发现,安卓手机里的收据功能超级实用,但是很多人却不知道怎么开启它呢?别急,今天就来手把手教你...
安卓8.0系统有多厉害,引领智... 你有没有发现,最近你的安卓手机是不是变得超级聪明,好像懂你的心思一样?没错,这就是安卓8.0系统的魔...
安卓升级系统占内存多少,升级前... 你有没有发现,每次安卓系统一升级,手机就像喝饱了水一样,膨胀了不少呢?这不,最近就有小伙伴好奇地问,...
安卓系统是离线运行吗,智能生活... 你有没有想过,你的安卓手机是不是一直在偷偷地联网呢?别急,今天就来揭开这个谜团,聊聊安卓系统是不是离...
安卓的系统怎么授权,从用户同意... 你有没有遇到过这种情况:手机里装了好多好用的安卓应用,但是有些应用需要授权才能正常运行。别急,今天就...
安卓微信支付系统好吗,安卓微信... 说到安卓微信支付系统,这可是咱们日常生活中不可或缺的好帮手呢!想象不用带钱包,不用找零钱,轻轻一点,...
安卓安装windows系统下载... 亲爱的读者们,你是否曾想过在你的安卓手机上安装Windows系统?想象那会是多么酷炫的事情啊!今天,...
安卓触摸双系统教学,安卓触摸双... 你有没有想过,手机里同时装上安卓和iOS系统,是不是就像拥有了两个世界?没错,这就是今天我要跟你分享...
安卓系统和ios系统的王者皮肤... 你有没有发现,最近不管是走在街头还是刷着手机,到处都是关于安卓系统和iOS系统的王者皮肤的热议呢?这...
苹果系统转移到安卓系统vivo... 你有没有想过,从苹果系统跳转到安卓系统,就像是从一个熟悉的小镇搬到繁华的大都市,充满了新鲜感和挑战呢...
安卓车机重启系统教程,轻松解决... 亲爱的车友们,你是否也遇到过安卓车机突然重启的尴尬情况呢?别急,今天就来给你详细讲解一下如何轻松应对...
安卓可以刷win系统吗 你有没有想过,你的安卓手机或者平板,是不是也能装上Windows系统呢?这听起来是不是有点像科幻电影...
安卓导航怎样从装系统 你有没有想过,你的安卓手机导航系统怎么就突然变得不灵光了?是不是觉得导航地图更新慢,路线规划老出错,...
小米10安卓系统怎么选,个性化... 你手里的小米10是不是已经迫不及待想要升级安卓系统了呢?别急,别急,让我来给你详细介绍怎么挑选最适合...
卡刷升级安卓系统,轻松实现系统... 你有没有发现,你的安卓手机最近有点儿“蔫儿”了?别急,别急,今天就来给你支个招——卡刷升级安卓系统!...