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 the encode and decode methods for the TinyURL service. 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.
题目的意思就是让你自己设计一个加密解密算法,使得将正常的URL加密之后生成的shortUrl解密之后仍为原来的URL;
思路1:无招胜有招,对于要加密的URL,直接输出其原型;
class Solution {
public:
// Encodes a URL to a shortened URL.
string encode(string longUrl) {
return longUrl;
}
// Decodes a shortened URL to its original URL.
string decode(string shortUrl) {
return shortUrl;
}
};
// Your Solution object will be instantiated and called as such:
// Solution solution;
// solution.decode(solution.encode(url));
思路2:参考别人的代码,可以生成一个随机的字符串,使得其唯一映射到原URL,并建立map,保存从正常URL到randstr的映射,以及randstr到正常URL的映射即可。
class Solution {
private:
unordered_map<string, string> long2short, short2long;
string dict;
public:
Solution(){
dict = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
long2short.clear();
short2long.clear();
srand(time(NULL));
}
// Encodes a URL to a shortened URL.
string encode(string longUrl) {
if (long2short.count(longUrl)){
return "http://tinyurl.com/" + long2short[longUrl];
}
string randstr;
for (int i = 0; i < 6; i++)randstr.push_back(dict[rand() % 62]);
int index = 0;
while (short2long.count(randstr)){
randstr[index] = dict[rand() % 62];
index = (index + 1) % 5;
}
short2long[randstr] = longUrl;
long2short[longUrl] = randstr;
return "http://tinyurl.com/" + randstr;
}
// Decodes a shortened URL to its original URL.
string decode(string shortUrl) {
string randstr = shortUrl.substr(shortUrl.find_last_of("/") + 1);
return short2long.count(randstr) ? short2long[randstr] : shortUrl;
}
};