Leetcode 1905 Solution

This article provides solution to leetcode question 1905 (design-authentication-manager)

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);
 */