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
,但我可以将我的单词分成字母,然后在数组中查找其他情况
答案 0 :(得分:4)
您的算法不正确且效率低(二次时间复杂度)。为什么正则表达式?
这是另一个想法。定义单词的签名,以便对单词的所有字母进行排序。例如,hello
的签名为ehllo
。
根据此定义,字谜是具有相同签名的字词,例如rats
,tars
和star
都具有签名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 }