回文
会社で、回文をチェックする処理を書くという話が出たので、その時に僕が書いた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