确定集合中是否存在前缀

Sha*_*rog 1 ruby string algorithm

给定一组字符串,说:

"Alice"
"Bob"
"C"
"Ca"
"Car"
"Carol"
"Caroling"
"Carousel"
Run Code Online (Sandbox Code Playgroud)

并给出一个字符串,说:

"Carolers"
Run Code Online (Sandbox Code Playgroud)

我想要一个函数,它返回数组中尚未包含的最小前缀.

对于上面的示例,函数应返回:"Caro".(随后的电话将返回"Carole")

我是Ruby的新手,虽然我可能会破解丑陋的东西(使用我的C/C++/Objective-C大脑),但我想学习如何正确(优雅地?)编写代码.

the*_*Man 5

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"
Run Code Online (Sandbox Code Playgroud)

上面我拿了第一个元素,但这显示了还有什么可用.

pp (carolers.keys - abbreviations.keys).sort 
# >> ["Caro", "Carole", "Caroler", "Carolers"]
Run Code Online (Sandbox Code Playgroud)

将所有上述内容包装在一个函数中,计算生成的缺失元素,然后迭代它们,将它们放到一个块中,或者使用枚举器逐个返回它们.

这是为单个单词生成的内容.对于阵列来说,它更复杂.

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"}
Run Code Online (Sandbox Code Playgroud)