Rust每日一练(Leetday0031) 解码方法、复原 IP 地址

news2025/2/3 8:03:25

 

目录

91. 解码方法  Decode Ways  🌟🌟

93. 复原 IP 地址 Restore IP Addresses  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


91. 解码方法  Decode Ways

一条包含字母 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 只包含数字,并且可能包含前导零。

代码1: 动态规划

package main

import (
	"fmt"
)

func numDecodings(s string) int {
	n := len(s)
	if n == 0 {
		return 0
	}
	dp := make([]int, n+1)
	dp[0] = 1
	if s[0] == '0' {
		dp[1] = 0
	} else {
		dp[1] = 1
	}
	for i := 2; i <= n; i++ {
		if s[i-1] != '0' {
			dp[i] = dp[i-1]
		}
		if s[i-2] == '1' || (s[i-2] == '2' && s[i-1] >= '0' && s[i-1] <= '6') {
			dp[i] += dp[i-2]
		}
	}
	return dp[n]
}

func main() {
	fmt.Println(numDecodings("12"))
	fmt.Println(numDecodings("226"))
	fmt.Println(numDecodings("0"))
}

输出:

2
3
0

代码2: 滚动数组

package main

import (
	"fmt"
)

func numDecodings(s string) int {
	n := len(s)
	if n == 0 {
		return 0
	}
	prev1, prev2 := 1, 0
	if s[0] == '0' {
		prev1, prev2 = 0, 0
	} else {
		prev1, prev2 = 1, 1
	}
	for i := 2; i <= n; i++ {
		cur := 0
		if s[i-1] != '0' {
			cur = prev1
		}
		if s[i-2] == '1' || (s[i-2] == '2' && s[i-1] >= '0' && s[i-1] <= '6') {
			cur += prev2
		}
		prev1, prev2 = cur, prev1
	}
	return prev1
}

func main() {
	fmt.Println(numDecodings("12"))
	fmt.Println(numDecodings("226"))
	fmt.Println(numDecodings("0"))
}

代码3: DFS

package main

import (
	"fmt"
)

func numDecodings(s string) int {
	n := len(s)
	memo := make([]int, n)
	return dfs(s, 0, memo)
}

func dfs(s string, start int, memo []int) int {
	if start == len(s) {
		return 1
	}
	if memo[start] != 0 {
		return memo[start]
	}
	res := 0
	if s[start] != '0' {
		res += dfs(s, start+1, memo)
	}
	if start+1 < len(s) && (s[start] == '1' || (s[start] == '2' && s[start+1] >= '0' && s[start+1] <= '6')) {
		res += dfs(s, start+2, memo)
	}
	memo[start] = res
	return res
}

func main() {
	fmt.Println(numDecodings("12"))
	fmt.Println(numDecodings("226"))
	fmt.Println(numDecodings("0"))
}

93. 复原 IP 地址 Restore IP Addresses

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245""192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

示例 2:

输入:s = "0000"
输出:["0.0.0.0"]

示例 3:

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

提示:

  • 1 <= s.length <= 20
  • s 仅由数字组成

代码1:暴力枚举

fn restore_ip_addresses(s: &String) -> Vec<String> {
    let mut res = Vec::new();
    if s.len() < 4 || s.len() > 12 {
        return res;
    }

    for a in 1..=3 {
        for b in 1..=3 {
            for c in 1..=3 {
                for d in 1..=3 {
                    if a + b + c + d == s.len() {
                        let s1 = &s[0..a];
                        let s2 = &s[a..a+b];
                        let s3 = &s[a+b..a+b+c];
                        let s4 = &s[a+b+c..];
                        if is_valid(&s1) && is_valid(&s2) && is_valid(&s3) && is_valid(&s4) {
                            let ip = format!("{}.{}.{}.{}", s1, s2, s3, s4);
                            res.push(ip);
                        }
                    }
                }
            }
        }
    }

    res
}

fn is_valid(s: &str) -> bool {
    if s.len() > 1 && s.chars().nth(0).unwrap() == '0' {
        return false;
    }
    true
}

fn main() {
    let s = String::from("25525511135");
    println!("{:?}", restore_ip_addresses(&s)); 
    let s = String::from("0000");
    println!("{:?}", restore_ip_addresses(&s)); 
    let s = String::from("101023");
    println!("{:?}", restore_ip_addresses(&s)); 
}

代码2:回溯法

fn restore_ip_addresses(s: &String) -> Vec<String> {
    let mut res = Vec::new();
    let mut path = String::new();
    if s.len() < 4 || s.len() > 12 {
        return res;
    }

    dfs_ip(&mut res, &mut path, 0, 0, &s[..]);
    res
}

fn dfs_ip(res: &mut Vec<String>, path: &mut String, u: i32, k: usize, s: &str) {
    if u == 4 {
        if k == s.len() {
            res.push(path.clone());
        }
        return;
    }

    for i in 1..=3 {
        if k + i > s.len() {
            return;
        }
        if is_valid(&s[k..k+i]) {
            path.push_str(&s[k..k+i]);
            if u != 3 {
                path.push('.');
            }
            dfs_ip(res, path, u+1, k+i, s);
            if u != 3 {
                path.pop();
            }
            path.truncate(path.len() - i);
        }
    }
}

fn is_valid(s: &str) -> bool {
    if s.len() > 1 && s.chars().nth(0).unwrap() == '0' {
        return false;
    }
    true
}

fn main() {
    let s = String::from("25525511135");
    println!("{:?}", restore_ip_addresses(&s)); 
    let s = String::from("0000");
    println!("{:?}", restore_ip_addresses(&s)); 
    let s = String::from("101023");
    println!("{:?}", restore_ip_addresses(&s)); 
}

输出:

["25.525.511.135", "255.25.511.135", "255.255.11.135", "255.255.111.35"]
["0.0.0.0"]
["1.0.10.23", "1.0.102.3", "10.1.0.23", "10.10.2.3", "101.0.2.3"]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/648167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python如何求平均

Python如何求平均 Python是一种非常流行的编程语言&#xff0c;它被广泛应用于各种领域&#xff0c;包括科学计算、数据分析、Web开发等。在这篇文章中&#xff0c;我们将介绍如何使用Python求平均值。 什么是平均数 平均数&#xff0c;也称为均值&#xff0c;是指一组数据的…

chatgpt赋能python:Python怎么求平均值?全面解析平均值计算方法

Python怎么求平均值&#xff1f;全面解析平均值计算方法 作为一种简洁易用的计算机编程语言&#xff0c;Python的应用范围已经越来越广泛。在Python中&#xff0c;我们可以轻松地进行各种统计和计算工作&#xff0c;其中求平均值是最常见的计算之一。在本文中&#xff0c;我们…

Redis过期策略

Redis 使用的过期删除策略是什么&#xff1f; Redis 是可以对 key 设置过期时间的&#xff0c;因此需要有相应的机制将已过期的键值对删除&#xff0c;而做这个工作的就是过期键值删除策略。 每当我们对一个 key 设置了过期时间时&#xff0c;Redis 会把该 key 带上过期时间存…

Redis 持久化-RDB和 持久化-AOF 的详细介绍以及区别

Redis 持久化-RDB 官方资料 在线文档: https://redis.io/topics/persistence 持久化方案 RDB&#xff08;Redis DataBase&#xff09; AOF&#xff08;Append Of File&#xff09; RDB 是什么? 在指定的时间间隔内将内存中的数据集快照写入磁盘&#xff0c; 也就Snapsh…

java中获取配置文件路径中含有中文,出现乱码的情况解决方案

问题背景&#xff1a;读取配置文件&#xff0c;但是读到的目录信息是中文乱码的。 第一步&#xff1a; 参考代码如上截图&#xff0c;方法即&#xff1a;读取jdbc配置&#xff0c;获取了配置文件&#xff08;jdbc.properties&#xff09;地址&#xff0c;然后加载这个文件读取…

chatgpt赋能python:Python中如何消除空格:从基础操作到高级技巧

Python中如何消除空格&#xff1a;从基础操作到高级技巧 Python是一种广泛使用的编程语言&#xff0c;深受许多工程师和开发者的喜爱。其中一个有用的技巧是如何消除字符串中的空格&#xff0c;特别是在处理和分析文本时。在本文中&#xff0c;我们将介绍三种不同的方法来解决…

springboot+vue+java学生选课成绩系统awwm9

主要内容&#xff1a; (1) 系统用户由三类组成&#xff1a;教师、学生和管理员 (2) 管理员负责的主要功能&#xff1a; 1. 用户进入登录界面&#xff0c;输入用户名&#xff0c;密码&#xff0c;选择管理员用户类型&#xff0c;然后点击“登录”按钮&#xff0c;后台验证…

Linux系统:stress-ng测压工具

目录 一、理论 1.stress工具简介与安装 2.语法及参数 3.具体安装 二、实验 1.运行8 cpu, 4 fork, 5 hdd, 4 io, 50 vm, 10小时 2.CPU测试 3.内存测试 4.IO测试 5.磁盘及I/O测试 三、问题 1. -bash: ./configure: 没有那个文件或目录 2. 下载yum源报错&#xff1a;未…

读发布!设计与部署稳定的分布式系统(第2版)笔记03_让系统稳定运行

1. 概念 1.1. 事务 1.1.1. 系统处理的抽象工作单元 1.1.1.1. 与数据库事务不同 1.1.1.2. 单个工作单元可能包含许多数据库事务 1.1.2. 系统存在的原因 1.1.2.1. 如果一个系统只能处理一种事务&#xff0c;那么它就是专用系统 1.1.2.2. 混合工作负载是系统能处理的不同事…

从 Google 删库,到蚂蚁跑路,Care 与 Fear 点燃的 Flare

Bytebase 第一次完成融资后写了一篇文章&#xff0c;主要讲了从行业层面做 Bytebase 的逻辑。一年过去了&#xff0c;这一年我们所处的开源/infra/数据库/企业服务赛道从热点归于平静&#xff0c;尤其在国内&#xff0c;又习惯性地反应过度&#xff0c;直接降到冰点。但从全球来…

学习PLC时为什么要学习上位机?

PLC是一种常用于工业自动化控制系统的设备。它用于监控和控制各种机器和过程&#xff0c;以实现自动化和优化生产。 学习PLC的过程中&#xff0c;了解和学习上位机是非常重要的。上位机是与PLC连接的计算机&#xff0c;它可以通过特定的软件与PLC进行通信、监控和控制。 以下…

【RabbitMQ教程】第七章 —— RabbitMQ - 发布确认高级

&#x1f4a7; 【 R a b b i t M Q 教程】第七章—— R a b b i t M Q − 发布确认高级 \color{#FF1493}{【RabbitMQ教程】第七章 —— RabbitMQ - 发布确认高级} 【RabbitMQ教程】第七章——RabbitMQ−发布确认高级&#x1f4a7; &#x1f337; 仰望天空&#xff0c…

分布式ID解决方案

常用的分布式 ID 的设计方案有哪些&#xff1f;Snowflake 是否受冬令时切换影响&#xff1f; 典型回答 首先&#xff0c;我们需要明确通常的分布式 ID 定义&#xff0c;基本的要求包括&#xff1a; 全局唯一&#xff0c;区别于单点系统的唯一&#xff0c;全局是要求分布式系…

NLP——Information Extraction信息提取

文章目录 Information Extraction 步骤Named Entity Recognition (NER)Typical Entity Tags 典型实体标签IO taggingIOB tagging神经网络做 NER Relation ExtractionRule-basedSupervised Relation ExtractionSemi-supervisedSemantic Drift 语义漂移Distant supervision 远程监…

chatgpt赋能python:在Python中添加NumPy

在Python中添加NumPy Python是一种功能强大且广泛使用的编程语言。它被广泛用于数据科学、人工智能和机器学习等领域。NumPy是一种用于数学和科学计算的Python库。本文将介绍在Python中如何添加NumPy库。 什么是NumPy? NumPy是一个开源的Python库&#xff0c;它提供了大量的…

ROCKETMQ极简介绍,顺序,事务示例

整体架构 Name Server 管理Broker实例的注册&#xff0c;提供心跳检测机制 路由管理&#xff1a; Producer和Conumser通过NameServer可以获取整个Broker集群的路由信息 生产者 Producer 以生产者组的形式出现&#xff0c;一个生产者组可以同时发送多个主题的消息 Broker …

计算机组成原理 之 第五章 中央处理器

1. CPU的功能和基本结构 &#xff08;1-1&#xff09;运算器的基本结构 a. 寄存器与ALU通讯方式一&#xff1a;专用数据通路方式 是专用数据通路方式&#xff08;并行传递&#xff09; 多路选择器&#xff08;MUX&#xff09;或三态门 b. 寄存器与ALU通讯方式二&#xff1a;CP…

chatgpt赋能python:Python中添加SEO元素的实践

Python中添加SEO元素的实践 在SEO&#xff08;Search Engine Optimization&#xff09;优化中&#xff0c;添加正确的SEO元素对网站的排名和可见性至关重要。Python作为一种广泛应用于网络开发的编程语言&#xff0c;提供了许多用于添加和管理SEO元素的工具和技术。在这篇文章…

chatgpt赋能python:Python怎么求完数

Python怎么求完数 什么是完数&#xff1f; 在数学中&#xff0c;完数指一个正整数&#xff0c;它的所有因子&#xff08;除了本身以外&#xff09;之和恰好等于该数本身。例如&#xff0c;6是一个完数&#xff0c;因为6的因子为1、2和3&#xff0c;而1 2 3 6。 Python如何…