Ruby正则表达式从字符串中删除所有连续的字母

时间:2013-03-27 01:09:51

标签: ruby regex

这是问题(来自Codeforces)

Polycarp经常考虑生命的意义。即使在编辑器中输入,他也会不断地这样做。每当他开始沉思时,他就不能完全集中注意力并反复按下需要按下一次的按键。例如,他可以输入“hhoow aaaare yyoouu”而不是短语“你好吗”。

Polycarp决定自动化纠正此类错误的过程。他决定在文本编辑器中编写一个插件,删除一对相同的连续字母(如果文本中有任何字母)。当然,这不是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

2 个答案:

答案 0 :(得分:5)

为什么它必须是正则表达式?

'foobar'.squeeze
=> "fobar"

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

squeeze是压缩所有字符或特定字符的运行的有用工具。以下是the documentation的一些示例:

"yellow moon".squeeze                  #=> "yelow mon"
"  now   is  the".squeeze(" ")         #=> " now is the"
"putters shoot balls".squeeze("m-z")   #=> "puters shot balls"

如果“aab”变成“b”,那么你就不会遵循问题中给出的例子,即“hhoow”变成“how”。根据你的陈述,它将是“w”,而“yyoouu”将是“”。我认为你正在阅读太多内容,而不是根据他们的样本输入和样本输出来理解问题。

答案 1 :(得分:0)

哈,比我第一次阅读时的想法更难。

怎么样?
s = "hhoow aaaareer yyoouu"
while s.gsub!(/(.)\1+/, '')
end
puts s
如果我正确理解了问题,

会离开s == 'w'