在ruby中使用Regxp查找Anagrams单词

时间:2015-09-27 13:58:07

标签: ruby string

anagram组是一组单词,只要通过重新排列字母就可以将任何一个单词转换成任何其他单词。例如,"rats""tars""star"是anagram组。

现在我有一系列文字,我将找到字谜文字 找到这个我写了以下代码

实际上它适用于某些词语,例如 scar cars ,但它不起作用 [疤痕购物车]。

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,但我可以将我的单词分成字母,然后在数组中查找其他情况

5 个答案:

答案 0 :(得分:4)

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

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

根据此定义,字谜是具有相同签名的字词,例如ratstarsstar都具有签名arst。实现这个想法的代码是直截了当的。

答案 1 :(得分:2)

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

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']]

答案 2 :(得分: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匹配内部的单个字符,因此您将获得与",或其中任何字母匹配的正则表达式原字。

<小时/> 因此,我很遗憾地称您的解决方案无法解决。

检查两个单词是否为字谜的一种非常简单的方法是对字符进行排序,看看结果是否相同。

答案 3 :(得分:0)

更快的方法是:

40    499948   error    ReferenceError: x is not defined
at EquipAdminController.vm.causeException (http://192.168.2.194:8100/js/bundle.js:1336:44)
at fn (eval at <anonymous> (http://192.168.2.194:8100/lib/ionic/js/ionic.bundle.js:21972:15), <anonymous>:2:265)
at http://192.168.2.194:8100/lib/ionic/js/ionic.bundle.js:55803:11
at Scope.$eval (http://192.168.2.194:8100/lib/ionic/js/ionic.bundle.js:24673:28)
at Scope.$apply (http://192.168.2.194:8100/lib/ionic/js/ionic.bundle.js:24772:23)
at HTMLButtonElement.listener (http://192.168.2.194:8100/lib/ionic/js/ionic.bundle.js:55802:15)
at Object.triggerEvent [as trigger] (http://192.168.2.194:8100/lib/ionic/js/ionic.bundle.js:811:15)
at Object.touchGesture [as handler] (http://192.168.2.194:8100/lib/ionic/js/ionic.bundle.js:2005:14)
at Object.detect (http://192.168.2.194:8100/lib/ionic/js/ionic.bundle.js:1389:30)
at Object.startDetect (http://192.168.2.194:8100/lib/ionic/js/ionic.bundle.js:1363:12)

我想你也可以这样做:

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

注意:的 这篇文章已根据Cary Swoveland的建议进行了编辑。

答案 4 :(得分: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 }