3

这是问题(来自 Codeforces)

Polycarp 经常思考生命的意义。他经常这样做,即使在编辑器中打字也是如此。每次他开始沉思时,他再也无法完全集中注意力,反复按下只需要按一次的键。例如,他可以输入“hhoow aaaare yyououu”来代替短语“你好吗”。

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是压缩所有字符或特定字符的有用工具。以下是文档中的一些示例:

“黄月”.squeeze #=>“黄月”
" 现在是".squeeze(" ") #=> " 现在是"
"推杆投球".squeeze("mz") #=> "推杆投球"

如果“aab”变成“b”,那么您没有遵循问题中给出的示例,即“hhow”变成了“how”。根据您的说法,它将是“w”,而“yyouuu”将是“”。我认为您对它的阅读过多,并且没有根据他们的示例输入和示例输出来理解问题。

于 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 回答