-
Notifications
You must be signed in to change notification settings - Fork 1
/
535+Encode and Decode TinyURL.cpp
93 lines (65 loc) · 2.28 KB
/
535+Encode and Decode TinyURL.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//////////////////////////////////////////////////////// 普通hash
class Solution {
private:
unordered_map<int, string> dataBase;
unordered_map<string, int> urlToKey;
int cnt = 0;
public:
// Encodes a URL to a shortened URL.
string encode(string longUrl) {
string res = "http://tinyurl.com/";
if (urlToKey.count(longUrl) > 0) {
return res + to_string(urlToKey[longUrl]);
}
cnt++;
dataBase[cnt] = longUrl;
urlToKey[longUrl] = cnt;
return res + to_string(cnt);
}
// Decodes a shortened URL to its original URL.
string decode(string shortUrl) {
int p = shortUrl.rfind('/') + 1; // 从字符串右侧开始匹配
int key = stoi(shortUrl.substr(p, int(shortUrl.size()) - p));
return dataBase[key];
}
};
// Your Solution object will be instantiated and called as such:
// Solution solution;
// solution.decode(solution.encode(url));
//////////////////////////////////////////////哈希
typedef long long ll;
const ll k1 = 1117;
const ll k2 = 1e9 + 7;
class Solution {
private:
unordered_map<int, string> dataBase;
unordered_map<string, int> urlToKey;
public:
// Encodes a URL to a shortened URL.
string encode(string longUrl) {
string res = "http://tinyurl.com/";
if (urlToKey.count(longUrl) > 0) {
return res + to_string(urlToKey[longUrl]);
}
ll key = 0, base = 1;
for (auto c : longUrl) {
key = (key + c * base) % k2;
base = (base * k1) % k2;
}
while (dataBase.count(key) > 0) {
key = (key + 1) % k2;
}
dataBase[key] = longUrl;
urlToKey[longUrl] = key;
return res + to_string(key);
}
// Decodes a shortened URL to its original URL.
string decode(string shortUrl) {
int p = shortUrl.rfind('/') + 1; // 从字符串右侧开始匹配
int key = stoi(shortUrl.substr(p, int(shortUrl.size()) - p));
return dataBase[key];
}
};
// Your Solution object will be instantiated and called as such:
// Solution solution;
// solution.decode(solution.encode(url));