目录

0535:TinyURL 的加密与解密(★)

力扣第 535 题

题目

TinyURL 是一种 URL 简化服务, 比如:当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL http://tinyurl.com/4e9iAk 。请你设计一个类来加密与解密 TinyURL 。

加密和解密算法如何设计和运作是没有限制的,你只需要保证一个 URL 可以被加密成一个 TinyURL ,并且这个 TinyURL 可以用解密方法恢复成原本的 URL 。

实现 Solution 类:

  • Solution() 初始化 TinyURL 系统对象。
  • String encode(String longUrl) 返回 longUrl 对应的 TinyURL 。
  • String decode(String shortUrl) 返回 shortUrl 原本的 URL 。题目数据保证给定的 shortUrl 是由同一个系统对象加密的。

示例:

输入:url = "https://leetcode.com/problems/design-tinyurl"
输出:"https://leetcode.com/problems/design-tinyurl"

解释:
Solution obj = new Solution();
string tiny = obj.encode(url); // 返回加密后得到的 TinyURL 。
string ans = obj.decode(tiny); // 返回解密后得到的原本的 URL 。

提示:

  • 1 <= url.length <= 104
  • 题目数据保证 url 是一个有效的 URL

分析

#1

转为唯一确定的 TinyURL,存在哈希表中即可。

最简单的就是计数,转为对应编号即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Codec:
    def __init__(self):
        self.i = 0
        self.d = {}

    def encode(self, longUrl: str) -> str:
        shortUrl = '//tinyurl.com/%d' % self.i
        self.d[shortUrl] = longUrl
        return shortUrl

    def decode(self, shortUrl: str) -> str:
        return self.d[shortUrl]

52 ms

#2

python 有内置函数 hash()。本题数据规模很小,可以不考虑冲突。

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Codec:
    def __init__(self):
        self.d = {}

    def encode(self, longUrl: str) -> str:
        shortUrl = str(hash(longUrl))
        self.d[shortUrl] = longUrl
        return shortUrl

    def decode(self, shortUrl: str) -> str:
        return self.d[shortUrl]

40 ms