LeetCode 解答 #49. Group Anagrams プログラミング練習
問題:
難易度: 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と言う関数でソートしてしまえばいいのです。
アルファベット順に並び替えてくれるのでとても便利です。
ソートすることで構成要素の判断が簡単に出来、問題自体は難しくないでしょう。
今日は以上。
よいプログラミング生活を!