这是问题(来自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
答案 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'
。