每天一道Rust-LeetCode(2019-06-08)
每天一道Rust-LeetCode(2019-06-08) 91. 解码方法
坚持每天一道题,刷题学习Rust.
题目描述
https://leetcode-cn.com/problems/decode-ways/
一条包含字母 A-Z 的消息通过以下方式进行了编码:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
解题过程
思路:
因为根据编号,只有连续两位的并且不超过26的才是有效的编码,
长度为N的解码方法:
a[0...N-1]={a[0...N-2] +a[N-1]}+{a[0...N-3]+a[n-2,n-1]}
如果后一种情况a[n-2,n-1]范围在26之内的话.
有点类似于斐波那契数列求解的过程
struct Solution {}
impl Solution {
pub fn num_decodings(s: String) -> i32 {
Solution::decodings(&s.as_bytes().iter().map(|i| i - ('0' as u8)).collect())
}
fn decodings(v: &Vec<u8>) -> i32 {
if v.len() <= 0 {
return 0;
}
let mut vcnt = Vec::with_capacity(v.len());
if v[0] == 0 {
return 0;
}
vcnt.push(1); //只有一个字符的时候肯定是只有一种编码
for i in 1..v.len() {
let mut cnt = 0;
if v[i] != 0 {
//只要不是0的数字,都是有效的编码
cnt = vcnt[i - 1]; //第一种分法
}
if i >= 1 {
//考虑 i-1,i联合起来的情形
let n = v[i - 1] * 10 + v[i];
if (v[i - 1] == 1 || v[i - 1] == 2) && n <= 26 {
//有效编码
if i >= 2 {
cnt += vcnt[i - 2];
} else {
cnt += 1; //考虑到只有两个字符,这时候下标就出界了.
}
} else if n == 0 {
return 0; //连续的两个数字0,是不可能被编码的,后续的也无效了
} else {
//超过的,不能有效编码,但是输入是合法的.
}
}
vcnt.push(cnt);
}
vcnt[v.len() - 1]
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_decodings() {
assert_eq!(2, Solution::num_decodings(String::from("12")));
assert_eq!(0, Solution::num_decodings(String::from("")));
assert_eq!(0, Solution::num_decodings(String::from("0")));
assert_eq!(1, Solution::num_decodings(String::from("10")));
assert_eq!(1, Solution::num_decodings(String::from("101")));
assert_eq!(0, Solution::num_decodings(String::from("100")));
assert_eq!(1, Solution::num_decodings(String::from("1")));
assert_eq!(3, Solution::num_decodings(String::from("226")));
assert_eq!(2, Solution::num_decodings(String::from("227")));
}
}
一点感悟
这个题目很简单,但是在处理0的时候被坑了几次,
一开始没注意0这种情况
但是后来又考虑的比较简单,所以错了几次.
主要有以下几种情况:
- 非法输入
开头的0,连续的00,都无法有效解码 - 中间出现的0,
10是合法的,30不合法,101注意不满足第二种拆分情况,因为01不是有效编码
其他
欢迎关注我的github,本项目文章所有代码都可以找到.
每天一道Rust-LeetCode(2019-06-08)的更多相关文章
- Heartbeat took longer than "00:00:01" at "09/06/2019 05:08:08 +00:00".
.netcore在k8s+docker+linux,部署后,偶尔会报这样的警告 Warn:Microsoft.AspNetCore.Server.KestrelHeartbeat took longe ...
- http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html
http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html
- TensorFlow从入门到实战资料汇总 2017-02-02 06:08 | 数据派
TensorFlow从入门到实战资料汇总 2017-02-02 06:08 | 数据派 来源:DataCastle数据城堡 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学 ...
- BlackArch Linux 2019.06.01 宣布发布
导读 BlackArch Linux是一个基于Arch Linux的发行版,专为渗透测试人员和安全研究人员设计,并包含大量渗透测试和安全实用程序,已宣布发布2019.06.01版本. BlackArc ...
- 【2019年08月06日】A股最便宜的股票
查看更多A股最便宜的股票:androidinvest.com/CNValueTop/ 便宜指数 = PE + PB + 股息 + ROE,四因子等权,数值越大代表越低估. 本策略只是根据最新的数据来选 ...
- leetcode——(四)2020.06.08
新的一周,leetcode计划:78,79,98,102,236,124,128 (23)
- 最新版IntelliJ IDEA2019.1破解教程(2019.04.08更新)
[原文链接]:https://www.tecchen.xyz/idea-crack.html 我的个人博客:https://www.tecchen.xyz,博文同步发布到博客园. 由于精力有限,对文章 ...
- 2016CCPC东北地区大学生程序设计竞赛【01/03/05/06/08】
吧啦啦啦啦啦啦啦啦啦啦啦能量,ACM,跨!变身!变成一个智障! 04正在酝酿中!!!马上更新!!!!! 01题意:有一个n个点的图,对于任意两个不同的点,他的权值是两个点下标的最小公倍数,求最小生出 ...
- 【2019年08月26日】A股最便宜的股票
查看更多A股最便宜的股票:androidinvest.com/CNValueTop/ 便宜指数 = PE + PB + 股息 + ROE,四因子等权,数值越大代表越低估. 本策略只是根据最新的数据来选 ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
随机推荐
- package.json文件配置详解
package.json 是npm init命令初始化后,在项目的根目录下自动生成的配置文件,它定义了这个项目的配置信息以及所需要的各种模块,npm install根据这个命令,自动下载所需的模块.p ...
- 算法八字符串转换正数(atoi)
请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之 ...
- k8s云集群混搭模式落地分享
在 <k8s云集群混搭模式,可能帮你节省50%以上的服务成本>一文中,介绍了使用k8s + 虚拟节点混合集群的方式,为负载具有时间段波峰.波谷交替规律的业务节约成本,提高服务伸缩效率的部署 ...
- docker 通过中间镜像加速部署
概要 实施 修改前的实施时间 制作编译用的镜像 测试修改后的实施时间 概要 使用 docker 打包镜像的时候, 每次耗费时间最多的就是 docker build 的过程. 特别是对于前端工程的打包, ...
- HTML+css基础 css的几种形式
1.行间样式:将style写在标签内的充当标签标签属性 2.行内样式
- Excel 快捷键
自从转岗为项目经理之后,Excel的使用频率大大的增加了,所以需要有意识的学习一下快捷键,提升自己的动作效率. 如下实在Microsoft 官网找到的资料,记录下,以作后备查看: 一.通过键盘访问功能 ...
- 关于 BenchmarkDotNet
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Order; using System.Reflection; namespace Be ...
- sentry 9.1.1docker版onepremise过程记录
sentry安装:https://github.com/getsentry/onpremise正确使用此文档安装步骤,安装版本9.1.1-onbuild,这个需要自改Dockerfile. 备注:构建 ...
- vertx-jersey
允许在vert.x中创建JAX-RS Jersey资源. 入门 将vertx-jersey依赖项添加到您的项目中 <dependency> <groupId>com.eng ...
- Maven环境搭配及继承
1. Maven简单介绍 Apache Maven是个项目管理和自动构建工具,基于项目对象模型(POM)的概念. 作用:完成项目的相关操作,如:编译,构建,单元测试,安装,网站生成和基于Maven部署 ...