leetcode-91解码方法(动态规划|记忆化搜索)[通俗易懂]

leetcode-91解码方法(动态规划|记忆化搜索)[通俗易懂]一条包含字母 A-Z 的消息通过以下映射进行了 编码 :‘A’ -> 1‘B’ -> 2…‘Z’ -> 26要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“111” 可以将 “1” 中的每个 “1” 映射为 “A” ,从而得到 “AAA” ,或者可以将 “11” 和 “1”(分别为 “K” 和 “A” )映射为 “KA” 。注意,“06” 不能映射为 “F” ,因为 “6” 和 “06” 不同。给你一个只含数字的 非空 字符串

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

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

‘Z’ -> 26
要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“111” 可以将 “1” 中的每个 “1” 映射为 “A” ,从而得到 “AAA” ,或者可以将 “11” 和 “1”(分别为 “K” 和 “A” )映射为 “KA” 。注意,“06” 不能映射为 “F” ,因为 “6” 和 “06” 不同。

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

题目数据保证答案肯定是一个 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" 。由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。
示例 4:

输入:s = "06"
输出:0
解释:"06" 不能映射到 "F" ,因为字符串开头的 0 无法指向一个有效的字符。 
 

提示:

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

题解

  1. 动态划归
    设置f[i]代表[1,i]一共有多少方案,f[i]和f[i-1]和f[i-2]都有联系
class Solution { 
   
public:
    int numDecodings(string s) { 
   
        int n = s.size(),num;
        vector<int> f(n + 1);
        f[0] = 1;
        stringstream ss;
        for(int i = 1;i <= n;i ++){ 
   
            if(s[i - 1] != '0')f[i] = f[i - 1];
            if(i - 2 >= 0){ 
   
                ss.clear();
                ss << s.substr(i - 2,2);
                ss >> num;
                if(num >= 10 && num < 27){ 
   
                    f[i] += f[i - 2];
                }
            }
        }
        return f[n];
    }
};
  1. 记忆化搜索
    记忆化搜索,f[i]代表陈[i,n]中有多少方案
class Solution { 
   
public:
    int f[101];
    int dfs(int u,string t){ 
   
        if(t == "")return 1;
        if(t[0] == '0')return 0;
        int res = 0,num;
        if(t[0] >= '1' && t[0] <= '9'){ 
   
            if(f[u + 1] == 0){ 
   
                f[u + 1] = dfs(u + 1,t.substr(1));
                if(f[u + 1] == 0)f[u + 1] = -1;
            }
            if(f[u + 1] != -1)res += f[u + 1];
        }
        stringstream ss;
        if(t.size() >= 2){ 
   
            ss << t.substr(0,2);
            ss >> num;
            if(num >= 10 && num <= 26)
            { 
   
                if(f[u + 2] == 0){ 
   
                    f[u + 2] = dfs(u + 2,t.substr(2));
                    if(f[u + 2] == 0)f[u + 2] = -1;
                }
                if(f[u + 2] != -1)res += f[u + 2];
            }
        }
        cout<<t<<" "<<res<<endl;
        return res;
    }
    int numDecodings(string s) { 
   
        return dfs(0,s);
    }
};
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168707.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月8日 下午4:36
下一篇 2022年8月8日 下午4:46


相关推荐

  • 端口被占用解决方法

    端口被占用解决方法解决方法一 修改端口 https blog csdn net zhouky1993 article details 解决方法二 关闭占用端口的进程 https blog csdn net zhouky1993 article details

    2026年3月20日
    2
  • 教你如何用Jenkins自动化部署项目(教程,从零到搭建完成)

    教你如何用Jenkins自动化部署项目(教程,从零到搭建完成)   最近在实习中接触了jenkins这个东西,所以花点时间了解了下。它可以在代码上传仓库(如github,gitee,gitlab)后,在jenkins(一个网站界面)中通过获取代码仓库中最新代码,进行自动化部署,而省去手动打包、上传服务器、部署这一系列步骤,非常方便。    下面教程分为以下几个部分:一、在你的本地电脑或者linux服务器上下载安装jenkins:jen…

    2022年5月5日
    451
  • Redis布隆过滤器原理与实践

    Redis布隆过滤器原理与实践背景在高并发请求时,业务数据一般会对数据进行缓存,提高系统并发量,因为磁盘IO和网络IO相对于内存IO的成百上千倍的性能劣势。做个简单计算,如果我们需要某个数据,该数据从数据库磁盘读出来需要0.1s,从交换机传过来需要0.05s,那么每个请求完成最少0.15s(当然,事实上磁盘和网络IO也没有这么慢,这里只是举例),该数据库服务器每秒只能响应67个请求;而如果该数据存在于本机内存里,读出来只需要10us,那么每秒钟能够响应100,000个请求。通过将高频使用的数据存在离cpu更近的位置,以减少数据传

    2022年10月7日
    8
  • navicat 15永久激活工具破解方法

    navicat 15永久激活工具破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    120
  • 数据可视化编程实战_大数据可视化

    数据可视化编程实战_大数据可视化以R可视化为桥梁经常有对比R,Python和Julia之间的讨论,似乎R语言在这三者之中是最为逊色的,实则不可一概而论。R语言在常规数据分析的场景下,如数据读入,预处理,整理,以及单机可视化方面表现出的优势,无论从用户体验,还是代码流畅度,令另两种语言略逊一筹。本文将从统计学中最基本的密度曲线的绘制,来串讲一下题目中所涉及的R语言可视化中三个强大的可视化包的用法,以及之间的联系。以此为基础,进阶高段,可以自然过渡到Python,Julia等语言的可视化实践活动中。首先引入本次实践使用的数

    2025年7月2日
    4
  • mysql 快速 修改 表名

    mysql 快速 修改 表名2019独角兽企业重金招聘Python工程师标准>>>…

    2022年5月6日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号