Skip to content

Commit 978ea1f

Browse files
authored
Merge pull request #5 from rihib/valid_anagram
Valid Anagram
2 parents 0eaf729 + b5c4f5a commit 978ea1f

File tree

4 files changed

+150
-0
lines changed

4 files changed

+150
-0
lines changed

pullrequests/valid_anagram/step1.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package validanagram
3+
4+
/*
5+
かなり前に解いたものなので、詳細については忘れてしましました。
6+
小文字のアルファベットのみが入力として与えられる場合と、Unicode文字も含まれる場合の2つの解法が含まれています。
7+
8+
基本的にはそれぞれの文字列に含まれる文字の種類と数が一致しているかを見ています。
9+
下の解法について、40行目で0未満になった場合のみfalseを返すのは一見おかしいように見えますが、30行目で文字数が等しいことを確認しているため、一方より多い文字があれば何かの文字は少なくなるはずであるため、ロジック的には問題ないと思います。
10+
*/
11+
func isAnagramStep1(s string, t string) bool {
12+
if len(s) != len(t) {
13+
return false
14+
}
15+
16+
var freq [26]int
17+
for i := 0; i < len(s); i++ {
18+
freq[s[i]-'a']++
19+
freq[t[i]-'a']--
20+
}
21+
for _, v := range freq {
22+
if v != 0 {
23+
return false
24+
}
25+
}
26+
return true
27+
}
28+
29+
func isAnagramUnicodeStep1(s string, t string) bool {
30+
if len(s) != len(t) {
31+
return false
32+
}
33+
34+
freq := make(map[rune]int)
35+
for _, r := range s {
36+
freq[r]++
37+
}
38+
for _, r := range t {
39+
freq[r]--
40+
if freq[r] < 0 {
41+
return false
42+
}
43+
}
44+
return true
45+
}

pullrequests/valid_anagram/step2.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package validanagram
3+
4+
/*
5+
よりシンプルにわかりやすく書くようにしました。例えばfreqのように省略するのではなくfrequencyにしました。
6+
7+
上については、Goの場合、s[i]のようにアクセスするとバイト列にアクセスすることになるので、今回の場合はたまたまascii文字しか入力として与えられないので問題ないのですが、あまりよろしくないと思ったので文字としてアクセスするように変更しました。
8+
9+
下の解法についてはStep1のロジックがわかりづらかったので、より明確になるように変更しました。
10+
*/
11+
func isAnagramStep2(s string, t string) bool {
12+
var frequency [26]int
13+
for _, r := range s {
14+
frequency[r-'a']++
15+
}
16+
for _, r := range t {
17+
frequency[r-'a']--
18+
}
19+
for _, n := range frequency {
20+
if n != 0 {
21+
return false
22+
}
23+
}
24+
return true
25+
}
26+
27+
func isAnagramUnicodeStep2(s string, t string) bool {
28+
frequency := make(map[rune]int)
29+
for _, r := range s {
30+
frequency[r]++
31+
}
32+
for _, r := range t {
33+
frequency[r]--
34+
}
35+
for _, n := range frequency {
36+
if n != 0 {
37+
return false
38+
}
39+
}
40+
return true
41+
}

pullrequests/valid_anagram/step3.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package validanagram
3+
4+
func isAnagramStep3(s string, t string) bool {
5+
return frequency(s) == frequency(t)
6+
}
7+
8+
func frequency(s string) [26]int {
9+
var f [26]int
10+
for _, r := range s {
11+
f[r-'a']++
12+
}
13+
return f
14+
}
15+
16+
// ちゃんとUnicodeに対応させるなら結合文字などを考慮する必要がある
17+
// https://github.com/rihib/leetcode/pull/5#discussion_r1706198268
18+
func isAnagramUnicodeStep3(s string, t string) bool {
19+
frequency := make(map[rune]int)
20+
for _, r := range s {
21+
frequency[r]++
22+
}
23+
for _, r := range t {
24+
frequency[r]--
25+
}
26+
for _, n := range frequency {
27+
if n != 0 {
28+
return false
29+
}
30+
}
31+
return true
32+
}

pullrequests/valid_anagram/step4.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//lint:file-ignore U1000 Ignore all unused code
2+
package validanagram
3+
4+
func isAnagramStep4(s string, t string) bool {
5+
return frequencies(s) == frequencies(t)
6+
}
7+
8+
func frequencies(s string) [26]int {
9+
var f [26]int
10+
for _, r := range s {
11+
f[r-'a']++
12+
}
13+
return f
14+
}
15+
16+
// ちゃんとUnicodeに対応させるなら結合文字などを考慮する必要がある
17+
// https://github.com/rihib/leetcode/pull/5#discussion_r1706198268
18+
func isAnagramUnicodeStep4(s string, t string) bool {
19+
frequencies := make(map[rune]int)
20+
for _, r := range s {
21+
frequencies[r]++
22+
}
23+
for _, r := range t {
24+
frequencies[r]--
25+
}
26+
for _, n := range frequencies {
27+
if n != 0 {
28+
return false
29+
}
30+
}
31+
return true
32+
}

0 commit comments

Comments
 (0)