Re:文字列の反転(括弧の対応を保存)
お題: 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() } }
アルゴリズム
- 括弧以外の部分を取り除いた文字列を取得
- その文字列から括弧のペアを取り除き続け、空文字になれば、対応の取れたペアと判断
- 対応の取れたペアの場合、反転+括弧の変換をして返却
- 対応の取れていないペアの場合、反転のみし返却
考察
whileでループしてるところと括弧の変換をしてるところ、もっとエレガントにかけないだろうか…。