3

これが問題です(Codeforcesから)

ポリカープは人生の意味についてよく考えます。彼は、エディターで入力するときでさえ、これを常に行います。彼が陰気になるたびに、彼は完全に集中できなくなり、一度だけ押す必要のあるキーを繰り返し押します。たとえば、「お元気ですか」というフレーズの代わりに、「hhoow aaaare yyouou」と入力できます。

Polycarp は、このようなエラーを修正するプロセスを自動化することにしました。彼は、同一の連続した文字のペアを削除するプラグインをテキスト エディターに作成することにしました (テキスト内に存在する場合)。もちろん、これは正確にはポリカープが必要としているものではありませんが、彼は何かから始めなければなりません!

Polycarp を支援し、メインのプラグイン モジュールを作成します。プログラムは、文字列から、連続する同一の文字のすべてのペアを削除する必要があります。削除後に新しいペアが表示された場合、プログラムはそれらも削除する必要があります。技術的には、その作業は次と同等である必要があります。文字列に連続する同一文字のペアが含まれている場合、そのペアを削除する必要があります。連続する同一文字の削除は、どの順序でも同じ結果になるため、どの順序でも実行できることに注意してください。

これが私の解決策です..何らかの理由で、非常に大きなテストケースに失敗します。私のものは、想定よりも多くの文字を取り除くようです。この正規表現は間違っていますか?

str = gets.chomp

while str =~ /(.)\1/
  str.gsub!(/(.)\1+/,'')
end

puts str

編集 - このソリューションは、連続するすべての文字グループを削除するため、機能しません。重複を取り除くだけです。私が正しいと信じているこの方法で行うと、非常に大きな文字列でタイムアウトします。

str = gets.chomp

while str =~ /(.)\1/
  str.gsub!(/(.)\1/,'')
end

puts str
4

2 に答える 2

7

なぜ正規表現でなければならないのですか?

'foobar'.squeeze
=> "fobar"

"hhoow aaaare yyoouu".squeeze
=> "how are you"

squeezeは、すべての文字または特定の文字の実行を圧縮するための便利なツールです。ドキュメントの例を次に示します。

"yellow moon".squeeze #=> "yellow mon"
" 今は ".squeeze(" ") #=> " 今は"
"パターがボールを撃つ".squeeze("mz") #=> "パターがボールを撃った"

「aab」が「b」になる場合は、質問に示されている例に従っていません。つまり、「how」が「how」に変わります。あなたの発言では「w」、「yyouu」は「」になります。サンプル入力とサンプル出力に基づいて、あなたはそれを読みすぎていて、問題を理解していないと思います。

于 2013-03-27T02:23:14.413 に答える
0

はあ、最初に読んだとき思ったより難しい。どうですか

s = "hhoow aaaareer yyoouu"
while s.gsub!(/(.)\1+/, '')
end
puts s

s == 'w'問題を正しく理解すれば、それは残ります。

于 2013-03-27T01:42:03.303 に答える