Conversation
| StringBuilder sb = new StringBuilder(); | ||
| for (int count : alphabetCount) { | ||
| sb.append("#").append(count); | ||
| } |
There was a problem hiding this comment.
Javaのことはあまり詳しくなく恐縮ですが、ここは[1,2,3]のような配列はmutableだからkeyにできないので、immutableな1#2#3という文字列に変換しているという理解でよいでしょうか?
There was a problem hiding this comment.
配列をkeyにすることは可能なのですが、配列の参照(アドレス)を元にhashを計算するので同一のObjectじゃないと同じような形をした配列でもMapから値を取り出せません。
以下のイメージです。
Map<int[], String> map = new HashMap<>();
int[] key1 = {1, 2};
int[] key2 = {1, 2};
map.put(key1, "hello");
System.out.println(map.get(key1)); // hello
System.out.println(map.get(key2)); // nullThere was a problem hiding this comment.
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<List<Integer>, List<String>> anagramKeyToAnagrams = new HashMap();
for (String str : strs) {
List<Integer> anagramKey = genAnagramKey(str);
anagramKeyToAnagrams
// 新規登録の場合は初期値として空の配列を登録
.computeIfAbsent(anagramKey, (key) -> new ArrayList<>())
.add(str);
}
return new ArrayList<>(anagramKeyToAnagrams.values());
}
private List<Integer> genAnagramKey(String unsorted) {
char[] chars = unsorted.toCharArray();
List<Integer> alphabetCount = new ArrayList<>();
for (char c: chars) {
//「-'a'」すると
// a → 0, b → 1, z → 26という具合になる
int index = c - 'a';
while (alphabetCount.size() <= index) {
alphabetCount.add(0);
}
alphabetCount.set(index, alphabetCount.get(index) + 1);
}
return alphabetCount;
}
}軽くJavaの実装を見たのですが、ArrayListだとハッシュ値の計算を要素から計算しているのでオブジェクトが異なってもhash値が一致するので上のコードだと動きますね。
There was a problem hiding this comment.
ArrayListのハッシュ計算について意識したことがなかったです。
実装確認しました。確かにこれでも意図した動作をしますね。
ありがとうございます!
| private String genAnagramKey(String unsorted) { | ||
| char[] chars = unsorted.toCharArray(); | ||
| int[] alphabetCount = new int[26]; | ||
| for (char c: chars) { |
There was a problem hiding this comment.
細かいのですが、for (char c : chars) でしょうか(:の左にスペース)。
| # step3 3回ミスなく書く | ||
|
|
||
| ## 解答 | ||
| - step1と同様の実装 |
| return new ArrayList<>(anagramKeyToAnagrams.values()); | ||
| } | ||
|
|
||
| private String genAnagramKey(String unsorted) { |
There was a problem hiding this comment.
generateの意味だと思いますが、genがどこまで一般的なのか自分はわからないのと、書く回数が多くないのでgenerateにすると思います。
There was a problem hiding this comment.
親しんだ環境では一般的だったので、半ば無意識でした。
ご指摘ありがとうございます!
| StringBuilder sb = new StringBuilder(); | ||
| for (int count : alphabetCount) { | ||
| sb.append("#").append(count); | ||
| } |
There was a problem hiding this comment.
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
HashMap<List<Integer>, List<String>> anagramKeyToAnagrams = new HashMap();
for (String str : strs) {
List<Integer> anagramKey = genAnagramKey(str);
anagramKeyToAnagrams
// 新規登録の場合は初期値として空の配列を登録
.computeIfAbsent(anagramKey, (key) -> new ArrayList<>())
.add(str);
}
return new ArrayList<>(anagramKeyToAnagrams.values());
}
private List<Integer> genAnagramKey(String unsorted) {
char[] chars = unsorted.toCharArray();
List<Integer> alphabetCount = new ArrayList<>();
for (char c: chars) {
//「-'a'」すると
// a → 0, b → 1, z → 26という具合になる
int index = c - 'a';
while (alphabetCount.size() <= index) {
alphabetCount.add(0);
}
alphabetCount.set(index, alphabetCount.get(index) + 1);
}
return alphabetCount;
}
}軽くJavaの実装を見たのですが、ArrayListだとハッシュ値の計算を要素から計算しているのでオブジェクトが異なってもhash値が一致するので上のコードだと動きますね。
|
読みやすかったです |
今回解いた問題:
49. Group Anagrams
次に解く問題:
349. Intersection of Two Arrays