File tree Expand file tree Collapse file tree 5 files changed +126
-0
lines changed
pullrequests/group_anagrams Expand file tree Collapse file tree 5 files changed +126
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments