Ruby anagram求解器

Rai*_*Son 15 ruby algorithm search anagram

我想在Ruby中编写一个anagram类型求解器,但它会对一个单词列表起作用,就像这样.

单词列表是:

the
these
one
owner
Run Code Online (Sandbox Code Playgroud)

我会允许用户输入一些字母,例如noe,并且它会在单词列表中搜索它可以使用用户输入的字母进行的单词并将带回来one,如果他们输入"eth"或甚至"the"它会带回来的the.我一直试图想出一个有效的方法来做到这一点,但我一直在循环每个单词,匹配单词中的一个字母,检查每个字母的单词和两个长度匹配.任何人都可以提出更好,更有效的方法吗?

Rob*_*aus 34

最重要的是,所有字谜在排序时都是相同的.因此,如果您构建一个列表(不知道Ruby调用这些)的列表,其中键是排序的单词,而值是排序到给定键的单词列表,那么您可以通过排序来快速找到字谜单词,在你的哈希中查找.


Dav*_*son 10

rrenaud的答案很棒,下面是一个如何在ruby中构造这样一个哈希的例子,给定一个名为" words" 的数组,其中包含字典中的所有单词:

@words_hash = words.each_with_object(Hash.new []) do |word, hash|
  hash[word.chars.sort] += [word]
end
Run Code Online (Sandbox Code Playgroud)

上面的代码假定为ruby 1.9.2.如果您使用的是旧版本,chars则不存在,但您可以使用.split('').sort.

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

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

  • 这与`words.group_by {| word |相同 word.chars.sort}` (3认同)

Ива*_*вац 5

一种解决方案可能是:

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