2 minute read

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 1:

Input: url = “https://leetcode.com/problems/design-tinyurl” Output: “https://leetcode.com/problems/design-tinyurl”

Explanation: Solution obj = new Solution(); string tiny = obj.encode(url); // returns the encoded tiny url. string ans = obj.decode(tiny); // returns the original url after decoding it.

Constraints:

1 <= url.length <= 104 url is guranteed to be a valid URL.

let shortUrlDB = new Map();
let longUrlDB = new Map();

/**
 * Encodes a URL to a shortened URL.
 *
 * @param {string} longUrl
 * @return {string}
 */
var encode = function (longUrl) {
  if (longUrlDB.has(longUrl)) {
    return shortUrlDB.get(longUrl);
  }
  const ch = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  let genUrl = "";
  let n = 7;
  while (n !== 0) {
    const randomNum = Math.floor(Math.random() * ch.length);
    genUrl += ch.charAt(randomNum);
    n--;
  }

  const encodedUrl = `http://tinyurl.com/${genUrl}`;
  shortUrlDB.set(encodedUrl, longUrl);
  longUrlDB.set(longUrl, encodedUrl);

  return encodedUrl;
};

/**
 * Decodes a shortened URL to its original URL.
 *
 * @param {string} shortUrl
 * @return {string}
 */
var decode = function (shortUrl) {
  return shortUrlDB.get(shortUrl);
};

The time complexity of the encode function is O(1) because the generation of the shortened URL is constant time, regardless of the length of the input long URL. The space complexity is O(n) where n is the number of unique long URLs stored in the database, as we are storing both the long URLs and their corresponding shortened URLs in separate maps.

The time complexity of the decode function is also O(1) because it involves a simple lookup in the shortUrlDB map. The space complexity is O(n) where n is the number of unique long URLs stored in the database, as we are storing both the long URLs and their corresponding shortened URLs in separate maps.

Leave a comment