2015-09-27 51 views
-2

anagram单词组是一组单词,任何一个单词都可以通过重新排列字母来转换为任何其他单词。例如,"rats","tars""star"是anagram组。在ruby中查找使用Regxp的Anagrams单词

现在我有话的数组,我要找到字谜话 找到这个我写了下面的代码

实际上它适用于像疤痕汽车一些单词,但它不工作 为[疤痕,购物车]。

temp=[] 
words.each do |e| 

    temp=e.split(//)      # make an array of letters 

    words.each do |z| 
     if z.match(/#{temp}/)   # match to find scar and cars 
       puts "exp is True" 
     else 
       puts "exp is false" 
     end  
    end 

end 

我只是觉得,虽然[abc]意味着a or b or c我可以我的话分开来的信件,然后寻找其他情况中,数组

+0

这个问题出了什么问题? – user5363938

回答

0

以更快的方式是:

def is_anagram? w1, w2 
    w1.chars.sort == w2.chars.sort 
end 

你可以也做这样的事情,我想:

def is_anagram? w1, w2 
    w2 = w2.chars 
    w1.chars.permutation.to_a.include?(w2) 
end 

然后像这样运行它:

is_anagram? "rats", "star" 
=> true 

注: 该帖子已被编辑为每卡里Swoveland的建议。

+1

'为每个置换执行'word2.split('')'。即使有了这个固定的,我认为你应该罢工“还没有”。 :-) –

+0

我想知道为什么你先没有提到你的第二种方法(排序),因为它显然更优越,直到我注意到后来在别人提到排序后再添加它。不好,因为它留下了这是你的想法的印象。你应该写下(原文如此)“编辑:正如其他人提到的那样,更好的方法......那可以实施如下..” –

+0

我实际上已经出来了,想到漫步时的第二种方式。不知道anagram算法有关于它的专利,道歉。 – DaniG2k

4

您的算法不正确且效率低下(二次时间复杂度)。为什么是正则表达式?

这是另一个想法。定义一个词的签名,以便对一个词的所有字母进行排序。例如,hello的签名是ehllo

通过这个定义,anagrams是具有相同签名的单词,例如,rats,tarsstar都具有签名arst。实现这个想法的代码是直截了当的。

+0

我不确定任何代码都可能不正确且效率低下,但我们知道您的意思...... –

2

如果两个单词包含相同的字母,则它们是anagrams。有几种方法可以确定他们是否做,最明显的是按字母顺序排列字母。然后你想把这些单词分成几组。这是一个想法:

words = %w[cats scat rats tars star scar cars carts] 

words.group_by {|word| word.each_char.sort }.values 
# => [['cats', 'scat'], ['rats', 'tars', 'star'], ['scar', 'cars'], ['carts']] 
1

问题是,/#{e.split(//)}/这里几乎是无意义的。

为了说明这一点,让我们看看会发生什么:

word = 'wtf' 
letters = word.split(//) # => ["w", "t", "f"] 
regex = /#{letters}/ # => /["w", "t", "f"]/ 
'"'.match(regex) # => 0 
','.match(regex) # => 0 
' '.match(regex) # => 0 
't'.match(regex) # => 0 

什么发生在一个正则表达式是什么插值以其to_s方法的结果替换它。由于character sets与内部的单个字符相匹配,因此您将得到一个匹配",或原始单词中任何字母的正则表达式。


因此,我将不幸地致电您的解决方案无法挽回。

检查两个单词是否为anagrams的非常简单的方法是对它们的字符进行排序并查看结果是否相同。

+0

好点,⩗。我认为你可以“非常”和“不幸”罢工。 –

0
words = ['demo', 'none', 'tied', 'evil', 'dome', 'mode', 'live', 
      'fowl', 'veil', 'wolf', 'diet', 'vile', 'edit', 'tide', 
      'flow', 'neon'] 

groups = words.group_by { |word| word.split('').sort } 
groups.each { |x, y| p y }