読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Re:文字列の反転(括弧の対応を保存)

どう書く Groovy

お題: Server error
投稿: Server error

括弧の対応を保ったまま、文字列を反転させるというお題。

(動作確認: Groovy Version: 1.5.7 JVM: 1.6.0_10)

こんな感じになりました

def reverseString2(String text) {
   def pairs = text.replaceAll(/[^\[\]\(\)\{\}]/, '')
   // 括弧整合チェック
   while (pairs) {
      if (pairs =~ /\[\]|\(\)|\{\}/) pairs = pairs.replaceAll(/\[\]|\(\)|\{\}/, '')
      else return text.reverse() // 不整合のため、反転のみして返却
   }
   // 括弧の整合がすべて取れたため、括弧の変換して反転して返却
   ['(':')', ')':'(', '{':'}', '}':'{', '[':']', ']':'['].with{
      return text.collect{ containsKey(it) ? get(it) : it }.reverse().join()
   }
}

アルゴリズム

  1. 括弧以外の部分を取り除いた文字列を取得
  2. その文字列から括弧のペアを取り除き続け、空文字になれば、対応の取れたペアと判断
  3. 対応の取れたペアの場合、反転+括弧の変換をして返却
  4. 対応の取れていないペアの場合、反転のみし返却

考察

whileでループしてるところと括弧の変換をしてるところ、もっとエレガントにかけないだろうか…。