首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby anagram求解器

Ruby anagram求解器
EN

Stack Overflow用户
提问于 2011-08-24 05:15:11
回答 7查看 22.4K关注 0票数 16

我想用Ruby写一个变形词类型的求解器,但它会对一个单词列表起作用,就像这样。

单词列表如下:

代码语言:javascript
复制
the
these
one
owner

我会允许用户输入一些字母,例如noe,它会在单词列表中搜索它可以使用用户输入的字母组成的单词,并将带回one,如果他们输入"eth“甚至" the”,它将带回the。我一直在尝试想一种有效的方法来做到这一点,但我一直在循环每个单词,匹配单词中的一个字母,检查每个字母的单词,并且两个长度都匹配。有没有人能给出一个更好更有效的方法呢?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-08-24 05:20:51

最重要的想法是,所有的字谜在排序时都是相同的。因此,如果您构建了一个列表的散列(不知道Ruby称之为什么),其中键是排序的单词,值是按给定键排序的单词列表,那么可以通过对单词进行排序并在散列中查找来非常快速地找到字形。

票数 35
EN

Stack Overflow用户

发布于 2011-08-24 05:46:35

rrenaud的答案很好,下面是一个如何在ruby中构造这样的散列的示例,给出了一个名为"words“的数组,它包含了字典中的所有单词:

代码语言:javascript
复制
@words_hash = words.each_with_object(Hash.new []) do |word, hash|
  hash[word.chars.sort] += [word]
end

上面的代码假设ruby为1.9.2。如果你使用的是旧版本,那么chars将不存在,但你可以使用.split('').sort

散列的默认对象被设置为空数组,这使得编码在某些情况下变得更容易,因为您不必担心散列给您的值为零。

来源:https://github.com/DavidEGrayson/anagram/blob/master/david.rb

票数 11
EN

Stack Overflow用户

发布于 2012-03-08 04:37:21

一种解决方案可能是:

代码语言:javascript
复制
def combine_anagrams(words)
  output_array = Array.new(0)
  words.each do |w1|
    temp_array = []
    words.each do |w2|
      if (w2.downcase.split(//).sort == w1.downcase.split(//).sort)
        temp_array.push(w2)
      end
    end
    output_array.push(temp_array)
  end
  return output_array.uniq
end
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7167634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档