每天一道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这种情况

但是后来又考虑的比较简单,所以错了几次.

主要有以下几种情况:

  1. 非法输入

    开头的0,连续的00,都无法有效解码
  2. 中间出现的0,

    10是合法的,30不合法,101注意不满足第二种拆分情况,因为01不是有效编码

其他

欢迎关注我的github,本项目文章所有代码都可以找到.

每天一道Rust-LeetCode(2019-06-08)的更多相关文章

  1. 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 ...

  2. http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html

    http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html

  3. TensorFlow从入门到实战资料汇总 2017-02-02 06:08 | 数据派

    TensorFlow从入门到实战资料汇总 2017-02-02 06:08 | 数据派 来源:DataCastle数据城堡 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学 ...

  4. BlackArch Linux 2019.06.01 宣布发布

    导读 BlackArch Linux是一个基于Arch Linux的发行版,专为渗透测试人员和安全研究人员设计,并包含大量渗透测试和安全实用程序,已宣布发布2019.06.01版本. BlackArc ...

  5. 【2019年08月06日】A股最便宜的股票

    查看更多A股最便宜的股票:androidinvest.com/CNValueTop/ 便宜指数 = PE + PB + 股息 + ROE,四因子等权,数值越大代表越低估. 本策略只是根据最新的数据来选 ...

  6. leetcode——(四)2020.06.08

    新的一周,leetcode计划:78,79,98,102,236,124,128 (23)

  7. 最新版IntelliJ IDEA2019.1破解教程(2019.04.08更新)

    [原文链接]:https://www.tecchen.xyz/idea-crack.html 我的个人博客:https://www.tecchen.xyz,博文同步发布到博客园. 由于精力有限,对文章 ...

  8. 2016CCPC东北地区大学生程序设计竞赛【01/03/05/06/08】

    吧啦啦啦啦啦啦啦啦啦啦啦能量,ACM,跨!变身!变成一个智障! 04正在酝酿中!!!马上更新!!!!!  01题意:有一个n个点的图,对于任意两个不同的点,他的权值是两个点下标的最小公倍数,求最小生出 ...

  9. 【2019年08月26日】A股最便宜的股票

    查看更多A股最便宜的股票:androidinvest.com/CNValueTop/ 便宜指数 = PE + PB + 股息 + ROE,四因子等权,数值越大代表越低估. 本策略只是根据最新的数据来选 ...

  10. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

随机推荐

  1. 【VS开发】COM组件技术概述

    这篇文章对COM做出来比较完整的解释,非常好. COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术.在COM构架下,人们可以开发出各种各样功能专一的组件,然后将它 ...

  2. Anaconda入门教程【快速掌握】

    Anaconda 使用指南 概述 很多学习python的初学者甚至学了有一段时间的人接触到anaconda或者其他虚拟环境工具时觉得无从下手, 其主要原因就是不明白这些工具究竟有什么用, 是用来做什么 ...

  3. pixijs shader贴图扫光效果

    pixijs shader贴图扫光效果 直接贴代码 const app = new PIXI.Application({ transparent: true }); document.body.app ...

  4. RESTful Webservice 和 SOAP Webserivce 对比及区别【转】

    接口抽象 RESTful Web 服务使用标准的 HTTP 方法 (GET/PUT/POST/DELETE) 来抽象所有 Web 系统的服务能力,而不同的是,SOAP 应用都通过定义自己个性化的接口方 ...

  5. 机器学习(九)-------- 聚类(Clustering) K-均值算法 K-Means

    无监督学习 没有标签 聚类(Clustering) 图上的数据看起来可以分成两个分开的点集(称为簇),这就是为聚类算法. 此后我们还将提到其他类型的非监督学习算法,它们可以为我们找到其他类型的结构或者 ...

  6. Python-绘制3D柱形图

    Python-绘制3D柱形图 本文主要讲解如何使用python绘制三维的柱形图,可以得到图1所示的效果. 图1 源代码如下: import numpy as np import matplotlib. ...

  7. Grafana的Docker部署方式

    docker run -d -p : --name=grafana544 -v D:/grafana/grafana-/data:/var/lib/grafana -v D:/grafana/graf ...

  8. NET 特性(Attribute)

    NET 特性(Attribute) 转自 博客园(Fish) 特性(Attribute):是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签. 您可以通过使用特 ...

  9. Winform中设置ZedGraph的字体和间距不随图形的缩放而缩放

    场景 C#窗体应用中使用ZedGraph曲线插件绘制图表: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99716066 Win ...

  10. Kafka Network层解析,还是有人把它说清楚了

    我们知道kafka是基于TCP连接的.其并没有像很多中间件使用netty作为TCP服务器.而是自己基于Java NIO写了一套. 几个重要类 先看下Kafka Client的网络层架构. 本文主要分析 ...