ruby - 确定集合中是否存在前缀

标签 ruby algorithm string

给定一组字符串,说:

"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/

相关文章:

ruby - 按日期排序的更好方法是什么?

java - 如何将 18 个字符的字符串转换为唯一 ID?

algorithm - 求二维数据集的面积

string - 如何从无界字符串中获取更小的字符串

c++ - 通过将文本文件读入字符串/vector 来计算加权/未加权 GPA

ruby-on-rails - 具有动态分割的资源

ruby - 工厂女工——理解协会

Ruby:写 `if o.class == ClassA or o.class == ObjectB or o.class == ObjectC` 的优雅方式

algorithm - 在具有给定约束的二维矩阵中找到最佳选择

c# - 用随机值替换字符串的最佳方法精确长度 c#