Torihaji's Growth Diary

Little by little, no hurry.

LeetCode生活2日目

はじめに

まだまだ続く、2日目。

今日はむずいか簡単か。

ではレッツゴー。

Valid Anagram

2つの文字列s,tが与えられる。tがsのアナグラムである場合はtrue、そうでない場合はfalseを返せ

アナグラムとはある文字列を分解し、並び替えて別の意味の文字列を作るという言葉遊びのこと。

解法1

思いついたのはこのくらい。

文字列をsortして結果が同じであればok。

# @param {String} s
# @param {String} t
# @return {Boolean}
def is_anagram(s, t)
    s.split('').sort == t.split('').sort
end

ただ文字列を配列に分解するのはcharsがいいらしい。

可読性: chars は文字ごとに分割する意図が明確で、コードを読む人にとってわかりやすいです。
マルチバイト文字対応: chars はUTF-8などのマルチバイト文字にも正しく対応します。一方、split('') は場合によっては意図しない動作をする可能性があります。
最新のスタイル: Ruby 1.9以降、chars が推奨される方法となっており、今後のメンテナンスや他の開発者との共同作業でも一貫性があります。

知らんかった。

解法2

アルファベットの全文字の出現回数を調べることで同一か判断。

上の解法より早いそうだ。

def anagram?(s, t)
  return false if s.size != t.size

  ('a'..'z').all? { |char| s.count(char) == t.count(char) }
end

終わりに

まだ簡単な方だと思う。

昔こういう問題を解いていた時に比べて

手が動くようになってきたと思う。

継続あるのみ。頑張りたい。