49.Group Anagramsを解いた

問題

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

文字列strsの配列が与えられたら、アナグラムをグループ化しなさい。 任意の順序で答えを返すことができる。

アプローチ

  • アナグラムかどうかを判定するためにソートした文字列をmapのキーとして、バリューにstrsの要素を格納する
  • strs配列の各要素をmapに格納するためにn回(strsの要素数)ループ
  • 解答用の二次元配列resultsを用意してmapのバリューに格納されていアナグラムをresultsに追加していく
  • 最初のループでn回、resultsに格納するループで最悪でもn回のループになるので時間計算量はO(n)となる

提出コード

/*
 * @lc app=leetcode id=49 lang=cpp
 *
 * [49] Group Anagrams
 */

// @lc code=start
class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        unordered_map<string, vector<string>> sm;
        vector<vector<string>> results;

        for (string str : strs) {
            string original_str = str;
            sort(str.begin(), str.end());

            sm[str].push_back(original_str);
        }

        for (auto i = sm.begin(); i != sm.end(); i++) {
            results.push_back(i->second);
        }
        return results;
    }
};
// @lc code=end

改善案

resultsに格納するためのループを範囲for文にした方がスッキリ書けそうと思った。
http://www.nct9.ne.jp/m_hiroi/linux/cpp31.htmlhttp://www.nct9.ne.jp/m_hiroi/linux/cpp31.html

for (auto i = sm.begin(); i != sm.end(); i++) {
  results.push_back(i->second);
}

↓↓

for (auto m : sm) {
  results.push_back(m->second);
}