class Solution { public: string mostCommonWord(string paragraph, vector<string>& banned) { unordered_set<string> s(banned.begin(), banned.end()); unordered_map<string, int> m; int idx = 0; while (true) { string t = getLowerWord(paragraph, idx); if (t.length() == 0) break; if (s.find(t) == s.end()) m[t]++; } string res; int curmax = 0; for (const auto & it : m) { if (it.second > curmax) { curmax = it.second; res = it.first; } } return res; } string getLowerWord(const string &p, int &idx) { while (idx < p.length() && !isalpha(p[idx])) idx++; string res; while (idx < p.length() && isalpha(p[idx])) { res.push_back(tolower(p[idx])); idx++; } return res; } };