Skip to content

Commit 0534b84

Browse files
authored
Merge pull request #3 from rihib/group_anagrams
Group Anagrams
2 parents bb2fdfc + 6e14d8f commit 0534b84

File tree

5 files changed

+126
-0
lines changed

5 files changed

+126
-0
lines changed

pullrequests/group_anagrams/step1.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package groupanagrams
3+
4+
/*
5+
すぐに思いついたのはソートした文字列をkeyとしてハッシュテーブルを使ってグルーピングすること。
6+
ただ、クイックソートの平均計算量はO(n log n)なので、O(n)でできればやりたいと思い、前に似た
7+
ような問題を解いたことがあったので、与えられた条件に小文字しか使われないと書いてあったので、
8+
配列のインデックスを用いて頻度を取得し、keyにすることにした。
9+
*/
10+
11+
func groupAnagramsStep1(strs []string) [][]string {
12+
m := make(map[[26]int][]string)
13+
for _, s := range strs {
14+
var freq [26]int
15+
for _, r := range s {
16+
freq[r-'a']++
17+
}
18+
m[freq] = append(m[freq], s)
19+
}
20+
21+
result := make([][]string, len(m))
22+
i := 0
23+
for _, v := range m {
24+
result[i] = v
25+
i++
26+
}
27+
return result
28+
}

pullrequests/group_anagrams/step2.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package groupanagrams
3+
4+
/*
5+
変数名を改善した。
6+
*/
7+
8+
func groupAnagramsStep2(strs []string) [][]string {
9+
m := make(map[[26]int][]string)
10+
for _, s := range strs {
11+
var freq [26]int
12+
for _, r := range s {
13+
freq[r-'a']++
14+
}
15+
m[freq] = append(m[freq], s)
16+
}
17+
18+
res := make([][]string, len(m))
19+
i := 0
20+
for _, v := range m {
21+
res[i] = v
22+
i++
23+
}
24+
return res
25+
}

pullrequests/group_anagrams/step3.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package groupanagrams
3+
4+
/*
5+
時間:3分
6+
変数名をリファクタした。
7+
8+
質問:
9+
- resという変数名をどう思いますか?
10+
- mという変数名をどう思いますか?(mapのmです)
11+
- wordsという変数名をどう思いますか?
12+
*/
13+
14+
func groupAnagramsStep3(strs []string) [][]string {
15+
m := make(map[[26]int][]string)
16+
for _, word := range strs {
17+
var freq [26]int
18+
for _, r := range word {
19+
freq[r-'a']++
20+
}
21+
m[freq] = append(m[freq], word)
22+
}
23+
24+
res := make([][]string, len(m))
25+
i := 0
26+
for _, words := range m {
27+
res[i] = words
28+
i++
29+
}
30+
return res
31+
}

pullrequests/group_anagrams/step4.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package groupanagrams
3+
4+
func groupAnagramsStep4(strs []string) [][]string {
5+
anagramsMap := make(map[[26]int][]string)
6+
for _, word := range strs {
7+
var frequency [26]int
8+
for _, r := range word {
9+
frequency[r-'a']++
10+
}
11+
anagramsMap[frequency] = append(anagramsMap[frequency], word)
12+
}
13+
14+
anagrams := make([][]string, len(anagramsMap))
15+
i := 0
16+
for _, words := range anagramsMap {
17+
anagrams[i] = words
18+
i++
19+
}
20+
return anagrams
21+
}

pullrequests/group_anagrams/step5.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package groupanagrams
3+
4+
func groupAnagramsStep5(strs []string) [][]string {
5+
anagramsMap := make(map[[26]int][]string)
6+
for _, word := range strs {
7+
var frequencies [26]int
8+
for _, r := range word {
9+
frequencies[r-'a']++
10+
}
11+
anagramsMap[frequencies] = append(anagramsMap[frequencies], word)
12+
}
13+
14+
anagrams := make([][]string, len(anagramsMap))
15+
i := 0
16+
for _, words := range anagramsMap {
17+
anagrams[i] = words
18+
i++
19+
}
20+
return anagrams
21+
}

0 commit comments

Comments
 (0)