diff --git a/c++/anagrams.cpp b/c++/anagrams.cpp index b9d855a..5c88b76 100644 --- a/c++/anagrams.cpp +++ b/c++/anagrams.cpp @@ -1,29 +1,60 @@ +#include +#include +#include +#include +#include + +using namespace std; + class Solution { public: - vector anagrams(vector &strs) { - /* https://oj.leetcode.com/problems/anagrams/ - ["abc", "ef", "cba", "xy", "yx"] -> ["abc", "cba", "xy", "yx"] - the order doesn't matter - */ - + vector anagrams(vector& strs) { + if (strs.empty() || strs.size() == 1) { + return {}; + } + + unordered_map> dict; + + for (const string& str : strs) { + string sorted_str = sortString(str); + dict[sorted_str].push_back(str); + } + vector result; - unordered_map dict; - - for (int i = 0; i < strs.size(); i++) { - string s = strs[i]; - sort(s.begin(), s.end()); - if (dict.find(s) == dict.end()) { - dict[s] = strs[i]; - } - else { - if (dict[s] != "#") { - result.push_back(dict[s]); - dict[s] = "#"; + for (const auto& pair : dict) { + if (pair.second.size() > 1) { + for (const string& s : pair.second) { + result.push_back(s); } - result.push_back(strs[i]); } } - + return result; } -}; \ No newline at end of file + +private: + string sortString(const string& str) { + string sorted_str; + for (char c : str) { + if (!isspace(c) && !ispunct(c)) { + sorted_str += tolower(c); + } + } + sort(sorted_str.begin(), sorted_str.end()); + return sorted_str; + } +}; + +int main() { + Solution sol; + vector strs = {"Listen", "Silent", "The eyes", "They see", "abc", "cba", "xy", "yx", "ef"}; + vector result = sol.anagrams(strs); + + cout << "Anagrams in the list are: "; + for (const string& s : result) { + cout << s << " "; + } + cout << endl; + + return 0; +}