It's raining cats and dogs.

無駄なことなんてないはず

回文

会社で、回文をチェックする処理を書くという話が出たので、その時に僕が書いたRubyのコードを書いておく

手抜きバージョン

もとの文字列とその反対をチェックして同じだったら回文じゃね?という発想。かなり手抜きだけどすっきり書けてるはず。

class String
  def kaibun?
    self == self.reverse
  end 
end

ちょっと真面目バージョン

文字列を半分でぶった切って、文字列先頭と文字列末尾から一文字ずつチェックしていき、異なる文字であればfalseを返す

class String
  def kaibun?
    n = self.size
    h = n / 2 
    h.times do |i| 
      return false unless self[i] == self[n-1-i]
    end 
    true
  end 
end

工夫?したところ

  • 真面目バージョンは最大でも文字列の半分しかチェックしないので、文字列が長くなったときでも、ループの回数は最大Θ(n/2)の増加の速度
  • Stringクラスをオープンクラスを使ってメソッドを追加する。そうすることで以下のような使い方ができてうれしい。
irb> 'hoge'.kaibun? #=> false
irb> 'hogegoh'.kaibun? #=> true