给定一组字符串,说:
"Alice"
"Bob"
"C"
"Ca"
"Car"
"Carol"
"Caroling"
"Carousel"
给定一个字符串,说:
"Carolers"
我想要一个返回数组中不存在的最小前缀的函数。
对于上面的例子,函数应该返回:“Caro”。 (后续调用将返回“Carole”)
我是 Ruby 的新手,虽然我可能会破解出一些丑陋的东西(使用我的 C/C++/Objective-C 大脑),但我想学习如何正确(优雅地?)编写代码。
最佳答案
Ruby 中有一个鲜为人知的神奇模块,叫做Abbrev。 .
require 'abbrev'
abbreviations = Abbrev::abbrev([
"Alice",
"Bob",
"C",
"Ca",
"Car",
"Carol",
"Caroling",
"Carousel"
])
carolers = Abbrev::abbrev(%w[Carolers])
(carolers.keys - abbreviations.keys).sort.first # => "Caro"
上面我使用了第一个元素,但这显示了其他可用的元素。
pp (carolers.keys - abbreviations.keys).sort
# >> ["Caro", "Carole", "Caroler", "Carolers"]
将以上所有内容包装在一个函数中,计算得到的缺失元素,然后迭代它们将它们生成一个 block ,或者使用枚举器逐个返回它们。
这是为单个单词生成的。对于数组,它更复杂。
require 'pp'
pp Abbrev::abbrev(['cat'])
# >> {"ca"=>"cat", "c"=>"cat", "cat"=>"cat"}
pp Abbrev::abbrev(['cat', 'car', 'cattle', 'carrier'])
# >> {"cattl"=>"cattle",
# >> "catt"=>"cattle",
# >> "cat"=>"cat",
# >> "carrie"=>"carrier",
# >> "carri"=>"carrier",
# >> "carr"=>"carrier",
# >> "car"=>"car",
# >> "cattle"=>"cattle",
# >> "carrier"=>"carrier"}
关于ruby - 确定集合中是否存在前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5402064/