0049-Group-Anagrams

Problem Description

Given an array of strings strs, group the anagrams together. You can return the answer in any order.

Solution

即使量級不大,仍然可能造成 TLE

速度偏慢:

vector<vector<string>> groupAnagrams(vector<string> &strs) {
  if (strs.empty()) {
    return {{""}};
  }
  vector<vector<string>> ans;
  vector<string> sorted;
  for (auto str : strs) {
    auto str2 = str;
    ranges::sort(str2);
    bool found = false;
    for (int i = 0; i < ans.size(); ++i) {
      if (str2 == sorted[i]) {
        ans[i].push_back(str);
        found = true;
        break;
      }
    }
    if (!found) {
      ans.push_back({str});
      ranges::sort(str);
      sorted.push_back(str);
    }
  }
  return ans;
}

較優雅的解法:可以把排序後的字串當 key,使用 hash map 來存放結果

vector<vector<string>> groupAnagrams(vector<string> &strs) {
  unordered_map<string, vector<string>> mp;
  for (auto s : strs) {
    auto s2 = s;
    ranges::sort(s2);
    mp[s2].push_back(s);
  }
  vector<vector<string>> ans;
  for (auto [k, v] : mp) {
    ans.push_back(v);
  }
  return ans;
}

設計特殊鍵值的解法(避免排序):

vector<vector<string>> groupAnagrams(vector<string> &strs) {
  unordered_map<string, vector<string>> mp;
  for (auto s : strs) {
    vector<int> cnt(26);
    for (auto c : s) {
      ++cnt[c - 'a'];
    }
    std::string key = "|";
    for (auto n : cnt) {
      key += to_string(n) + "|";
    }
    mp[key].push_back(s);
  }
  vector<vector<string>> ans;
  for (auto [k, v] : mp) {
    ans.push_back(v);
  }
  return ans;
}

0242-Valid-Anagram