LeetCode 解答 #49. Group Anagrams プログラミング練習

問題:
f:id:stlisacity:20180722142650p:plain
難易度: medium
入力:  String[] strs
目的: 入力文字列群の内、同じ文字で構成されている文字列をグループ化せよ
出力: List>

入力はString型のArrayです。
中には例えば"eat", "tea"等の文字列が入っています。
そのうちの同じ文字列で構成された単語を一つのリストとし、
入力をグループ化し返す関数を作る問題です。
同じ構成要素の単語がない場合は一つの文字列が一つのグループになります。

注意すべき事: 

  • 入力はすべて小文字である。
  • グループ化する際の順序は無視してよい。

以下回答です。

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> res = new ArrayList<>();
        HashMap<String, List<String>> map = new HashMap<>();
        for (int i=0; i<strs.length; i++) {
            char[] ch = strs[i].toCharArray();
            Arrays.sort(ch);
            String tempStr = new String(ch);
            if (map.containsKey(tempStr)) {
                map.get(tempStr).add(strs[i]);
            }
            else {
                List<String> tempList = new ArrayList<>();
                tempList.add(strs[i]);
                map.put(tempStr, tempList);
            }
        }
        for (String s: map.keySet()) {
            res.add(map.get(s));
        }
        return res;
    }
}

考え方は、HashMapを作り、Mapの中に同じ構成要素で構成された文字列がある場合はそこに追加、
ない場合は新しく追加する考えかたです。
どうやって同じ文字列で構成された単語かを判断するか?
一回StringのtoCharArrayと言う関数でソートしてしまえばいいのです。
アルファベット順に並び替えてくれるのでとても便利です。
ソートすることで構成要素の判断が簡単に出来、問題自体は難しくないでしょう。

今日は以上。
よいプログラミング生活を!