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);
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ffmpeg 安装(支持h.265)

    ffmpeg 安装(支持h.265)安装FFMPEG需要的所有组件sudoapt-getupdatesudoapt-get-yinstallautoconfautomakebuild-essentiallibass-devlibfreetype6-dev\libsdl2-devlibtheora-devlibtoollibva-devlibvdpau-devlibvorbis-devl…

  • sqlyog证书密钥(注册码)_SQLyog安装教程

    sqlyog证书密钥(注册码)_SQLyog安装教程SQLyogv12.09(64bit)注册码姓名(Name):cr173序列号(Code):8d8120df-a5c3-4989-8f47-5afc79c56e7c或者(OR)姓名(Name):ttrar序列号(Code):8d8120df-a5c3-4989-8f47-5afc79c56e7c…

  • sqlserver之清空表内数据「建议收藏」

    sqlserver之清空表内数据「建议收藏」方法:—xxx为表名truncatetablexxx

  • Java开发已经烂大街,没前途了?假的

    Java开发已经烂大街,没前途了?假的经过了多年的发展,Java早已由一门单纯的计算机编程语言,演变为了一套强大的技术体系。在程序员中,Java开发工程师就占据20%的比例,不可否认,Java语言有着广泛的行业发展前景,它在行业中的影响力已是不可避免的。所以许多人想通过学习Java转行、找好工作,所以报班学习Java开发的人越来越多。很多人说Java开发已经烂大街了,现在学Java没前途。真的是这样的吗?现在学Java还有前途吗?本文,给大家详细解答一下。1、Java人才缺口大根据职友集数据显示,Java开发的全国招聘量123805条。从

  • 替换指定字符串中,键对应的键值

    替换指定字符串中,键对应的键值

  • linux ftp lcd 命令,Linux FTP命令使用实例「建议收藏」

    linux ftp lcd 命令,Linux FTP命令使用实例「建议收藏」之前我们说过linuxscp的命令,是用来两台Linux服务器之前传输数据的。那么我们如何在Linux服务器与没有SSH的虚拟主机传输数据呢,我们可以使用Linux的FTP命令来实现,下面是一些使用实例。ftpwww.centos.bz这个命令表示试图连接www.centos.bz的FTP服务器,如果成功连接上,就会要求输入FTP用户名和密码。ftp>help连接上FTP服务器后,键入…

发表回复

您的电子邮箱地址不会被公开。

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