Encode and Decode TinyURL TinyURL 的加密與解密
阿新 • • 發佈:2019-01-02
TinyURL是一種URL簡化服務, 比如:當你輸入一個URL https://leetcode.com/problems/design-tinyurl
時,它將返回一個簡化的URL http://tinyurl.com/4e9iAk
.
要求:設計一個 TinyURL 的加密 encode
和解密 decode
的方法。你的加密和解密演算法如何設計和運作是沒有限制的,你只需要保證一個URL可以被加密成一個TinyURL,並且這個TinyURL可以用解密方法恢復成原本的URL。
思路:
為了高效和防止大量的重複網址被編碼,採用6位數字大小寫字母編碼的方式,一共有(10+26*2)^6將近568億的數量,完全夠用了。其中我們需要兩個map,urlToKey儲存longUrl到shortUrl到對映,encode的時候用。keyToUrl儲存shortUrl到longUrl的對映,decode的時候用。編碼和解碼的時候如果map裡已經有儲存了,那麼直接返回即可,否則再重新生成。
參考程式碼:
class Solution { private: string SEED = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; string BASE = "http://tinturl.com/"; unordered_map<string, string> urlToKey; unordered_map<string, string> keyToUrl; public: // Encodes a URL to a shortened URL. string encode(string longUrl) { if (longUrl.empty()) return NULL; if (urlToKey.find(longUrl) != urlToKey.end()) return urlToKey[longUrl]; string result = ""; do { result = ""; srand(int(time(0))); for (int i = 0; i < 6; i++) { result.push_back(SEED[rand() % SEED.size()]); } } while (urlToKey.find(result) != urlToKey.end()); urlToKey[longUrl] = result; keyToUrl[result] = longUrl; return result; } // Decodes a shortened URL to its original URL. string decode(string shortUrl) { if (shortUrl.empty()) return NULL; string result = ""; string tmp = shortUrl.substr(shortUrl.find_last_of('/') + 1, shortUrl.size() - shortUrl.find_last_of('/') + 1); if (keyToUrl.find(tmp) != keyToUrl.end()) { result=keyToUrl[tmp]; } return result; } }; // Your Solution object will be instantiated and called as such: // Solution solution; // solution.decode(solution.encode(url));