Leetcode 1905 Solution
This article provides solution to leetcode question 1905 (design-authentication-manager)
Access this page by simply typing in "lcs 1905" in your browser address bar if you have bunnylol configured.
Leetcode Question Link
https://leetcode.com/problems/design-authentication-manager
Solution
class AuthenticationManager {
int m_timeToLive;
unordered_map<string, int> m_expireTimes;
set<pair<int, string> > m_tokens;
public:
AuthenticationManager(int timeToLive) {
m_timeToLive = timeToLive;
}
void generate(string tokenId, int currentTime) {
m_expireTimes[tokenId] = currentTime + m_timeToLive;
m_tokens.insert(make_pair(currentTime + m_timeToLive, tokenId));
}
void renew(string tokenId, int currentTime) {
expireTokens(currentTime);
if (m_expireTimes.find(tokenId) == m_expireTimes.end())
return;
m_tokens.erase(make_pair(m_expireTimes[tokenId], tokenId));
m_expireTimes[tokenId] = currentTime + m_timeToLive;
m_tokens.insert(make_pair(currentTime + m_timeToLive, tokenId));
}
int countUnexpiredTokens(int currentTime) {
expireTokens(currentTime);
return m_tokens.size();
}
void expireTokens(int currentTime) {
std::vector<set<pair<int, string>>::iterator> items_to_delete;
for (auto it = m_tokens.begin(); it != m_tokens.end(); it++)
{
if (it->first <= currentTime)
items_to_delete.push_back(it);
else
break;
}
for (auto it = items_to_delete.begin(); it != items_to_delete.end(); it++)
{
m_expireTimes.erase((*it)->second);
m_tokens.erase(*it);
}
}
};
/**
* Your AuthenticationManager object will be instantiated and called as such:
* AuthenticationManager* obj = new AuthenticationManager(timeToLive);
* obj->generate(tokenId,currentTime);
* obj->renew(tokenId,currentTime);
* int param_3 = obj->countUnexpiredTokens(currentTime);
*/