目录
解码方法方法一:动态规划(Java)方法二:动态规划——优化(go)解码方法
一条包含字母 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 = "0"
输出:0
解释:没有字符映射到以 0 开头的数字。
含有 0 的有效映射是 "J" -> "10" 和 "T"-> "20" 。
由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。
提示:
1 <= s.length <= 100
s 只包含数字,并且可能包含前导零。
方法一:动态规划(Java)
对于给定的字符串 s ,设它的长度为 n ,其中的字符从左到右依次为 s[1],s[2],...,s[n]。我们可以使用动态规划的方法计算出字符串的解码方法数。
具体地,设 fi表示字符串s的前i个字符 s[1..i]的解码方法数。在进行状态转移时,我们可以考虑最后一次解码使用了 s中的哪些字符
class Solution { public int numDecodings(String s) { int n = s.length(); int[] f = new int[n + 1]; f[0] = 1; for (int i = 1; i <= n; ++i) { if (s.charAt(i - 1) != "0") { f[i] += f[i - 1]; } if (i > 1 && s.charAt(i - 2) != "0" && ((s.charAt(i - 2) - "0") * 10 + (s.charAt(i - 1) - "0") <= 26)) { f[i] += f[i - 2]; } } return f[n]; } }
时间复杂度:o(n)
空间复杂度:o(n)
方法二:动态规划——优化(go)
具体的方法思路请看上文表述,本方法对空间复杂度进行了优化,通过使用临时变量的方式,使得空间复杂度从o(n)降为o(1)
func numDecodings(s string) int { n := len(s) // a = f[i-2], b = f[i-1], c = f[i] a, b, c := 0, 1, 0 for i := 1; i <= n; i++ { c = 0 if s[i-1] != "0" { c += b } if i > 1 && s[i-2] != "0" && ((s[i-2]-"0")*10+(s[i-1]-"0") <= 26) { c += a } a, b = b, c } return c }
时间复杂度:o(n)
空间复杂度:o(1)
以上就是Go Java算法之解码方法示例详解的详细内容,更多关于Go Java算法解码的资料请关注脚本之家其它相关文章!
X 关闭
X 关闭
- 1亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 2现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 3如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 4AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 5转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 6充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 7好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 8名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 9亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战
- 10京东绿色建材线上平台上线 新增用户70%来自下沉市场