535. TinyURL 的加密与解密

TinyURL是URL简化服务,需设计其加密和解密方法。加密和解密算法无限制,关键要保证URL能加密成TinyURL,且TinyURL可解密恢复成原URL。

TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL http://tinyurl.com/4e9iAk.

要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的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、付费专栏及课程。

余额充值