535. Encode and Decode TinyURL
Design, Hash Table, String, Hash Function, AMateList ·Problem Statement
link: LeetCode.cn LeetCode Note: This is a companion problem to the System Design problem: Design TinyURL. TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/design-tinyurl and it returns a short URL such as http://tinyurl.com/4e9iAk. Design a class to encode a URL and decode a tiny URL.
There is no restriction on how your encode/decode algorithm should work. You just need to ensure that a URL can be encoded to a tiny URL and the tiny URL can be decoded to the original URL.
Implement the Solution class:
Solution() Initializes the object of the system. String encode(String longUrl) Returns a tiny URL for the given longUrl. String decode(String shortUrl) Returns the original long URL for the given shortUrl. It is guaranteed that the given shortUrl was encoded by the same object.
Example:
Input: url = "https://leetcode.com/problems/design-tinyurl"
Output: "https://leetcode.com/problems/design-tinyurl"
Constraints:
1 <= url.length <= 104 url is guranteed to be a valid URL.
Solution Approach
The solution uses a hash map to map long URLs to unique short URLs and vice versa, allowing efficient encoding and decoding operations.
Algorithm
- Initialization: Create two hash maps, one for mapping long URLs to short URLs (encodeMap) and another for mapping short URLs back to long URLs (decodeMap).
- Encoding: Check if the long URL is already encoded; if not, generate a unique short URL by appending the current count of encoded URLs to a base URL, then store the mappings in both hash maps.
- Decoding: Retrieve the original long URL by looking up the short URL in the decodeMap and return it.
Implement
class Codec:
def __init__(self):
self.encodeMap = {}
self.decodeMap = {}
self.base = "http://tinyurl.com/"
def encode(self, longUrl: str) -> str:
"""Encodes a URL to a shortened URL.
"""
if longUrl not in self.encodeMap:
shortUrl = self.base + str(len(self.encodeMap) + 1)
self.encodeMap[longUrl] = shortUrl
self.decodeMap[shortUrl] = longUrl
return self.encodeMap[longUrl]
def decode(self, shortUrl: str) -> str:
"""Decodes a shortened URL to its original URL.
"""
return self.decodeMap[shortUrl]