535. TinyURL 的加密与解密

设计 TinyURL 系统:LeetCode 题解与实现分析

一、题目描述

TinyURL 是一种 URL 简化服务,它可以将一个很长的网址转换成一个短小的网址。例如:

  • 原始链接:https://leetcode.com/problems/design-tinyurl
  • 转换后:http://tinyurl.com/4e9iAk

本题的任务是设计这样一个 URL 简化系统,实现两个核心方法:

  • encode(longUrl: str) -> str:将原始 URL 编码为 TinyURL。
  • decode(shortUrl: str) -> str:将 TinyURL 解码回原始 URL。

要求:

  • 一个 URL 可以被编码成一个唯一的 TinyURL;
  • 编码后的 TinyURL 一定能被成功还原为原始 URL;
  • 不限制具体的编码算法,只需确保功能正确;
  • 所有的 decode 输入都一定来自同一个系统中的 encode 输出。

二、解题分析

这是一个设计题,不是传统的算法题,更注重系统设计的合理性与完整性。我们需要构建一个映射系统来维护 原始 URL

为了设计实现包含初始化、`encode` 方法和 `decode` 方法的 TinyURL 加密解密功能类,可以采用如下的 Python 代码实现: ```python import string import random class Solution: def __init__(self): # 用于存储长 URL 到短 URL 的映射 self.long_to_short = {} # 用于存储短 URL 到长 URL 的映射 self.short_to_long = {} # 定义短 URL 可能包含的字符集 self.chars = string.ascii_letters + string.digits def encode(self, longUrl): # 如果长 URL 已经存在于映射中,直接返回对应的短 URL if longUrl in self.long_to_short: return self.long_to_short[longUrl] # 生成一个随机的短 URL while True: shortUrl = ''.join(random.choice(self.chars) for _ in range(6)) if shortUrl not in self.short_to_long: break # 更新映射 self.long_to_short[longUrl] = shortUrl self.short_to_long[shortUrl] = longUrl return shortUrl def decode(self, shortUrl): # 根据短 URL 查找对应的长 URL return self.short_to_long.get(shortUrl) ``` ### 代码解释 1. **`__init__` 方法**:初始化两个字典 `long_to_short` 和 `short_to_long`,分别用于存储长 URL 到短 URL 的映射和短 URL 到长 URL 的映射。同时,定义了短 URL 可能包含的字符集 `chars`。 2. **`encode` 方法**:首先检查长 URL 是否已经存在于映射中,如果存在则直接返回对应的短 URL。否则,生成一个随机的 6 位短 URL,并确保该短 URL 没有被使用过。然后更新两个映射字典,并返回生成的短 URL。 3. **`decode` 方法**:根据短 URL 从 `short_to_long` 字典中查找对应的长 URL 并返回。 ### 测试代码 ```python # 创建 Solution 类的实例 obj = Solution() # 长 URL long_url = "https://leetcode.com/problems/design-tinyurl" # 对长 URL 进行编码 tiny_url = obj.encode(long_url) # 对短 URL 进行解码 original_url = obj.decode(tiny_url) print("Original URL:", long_url) print("Tiny URL:", tiny_url) print("Decoded URL:", original_url) ``` ### 复杂度分析 - **时间复杂度**:`encode` 和 `decode` 方法的时间复杂度均为 $O(1)$,因为主要操作是字典的查找和插入,这些操作的时间复杂度都是常数级的。 - **空间复杂度**:$O(n)$,其中 $n$ 是存储的 URL 数量,主要用于存储两个映射字典。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值