🐭

NeetCodeをGo言語で挑戦~is Anagram

2024/07/25に公開

NeetCode とは?

前回の記事を参考にしてください。
https://zenn.dev/yuusukesan/articles/try-neetcode-golang-duplicate-integer

今回は、第2問目となります。

is Anagram

is Anagram は、2つの文字列を引数として渡します。
その渡された引数aと引数bの文字の種類と数が一致しているかを判定します。
一致すれば、True を戻します。もし、そうでなければ、False を戻します。

例えば、以下の場合は、true と返します。

Input : "hello" , "olleh"
Output : true

以下の場合は、false と返します。

Input : "golang", "langpo"
Output : false

アプローチ方法

順番に線形に処理していくとなると文字数が増えるたびに、処理時間も膨大になります。
そこで、ハッシュマップを利用します。

以下のフローにて実装しています。

  1. 入力される文字列の数が一致しない場合は、falseとする
  2. ハッシュマップを作成します。
    Go言語では、文字列が不変(immutable)となるので、ミュータブル(mmutable)なrune型にて対応します。

【参考】
https://qiita.com/ruiu/items/2bb83b29baeae2433a79

  1. 入力される文字列sを増加させて、もう一方の入力される文字列tを減少させます。
  2. 最終的に文字列カウントが0となっていることを確認します。

実装サンプル

func isAnagram(s string, t string) bool {
	if len(s) != len(t) {
		return false
	}
	Count := make(map[rune]int)
	for i := 0; i < len(s); i++ {
		Count[rune(s[i])]++
		Count[rune(t[i])]--
	}
	for _, c := range Count {
		if c != 0 {
			return false
		}
	}
	return true
}

まとめ

今回も、easy レベルの問題でした。
ハッシュマップを最初、2つ用意したのですが、途中で、1つでできるかもと考えて、実装中に方針を修正しました。
今回は、仮設出し、方針決めから実装までで、10 分程度でした。

引き続き、アウトプットの練習も兼ねて、取り組んでいきたいと思います。

Discussion