我想在红宝石中说一句不容易的话。如果我在数组中有一个单词
words = ["foo","ofo"]
如何将此与另一个字符串(如“oof”)进行比较并返回真值
答案 0 :(得分:2)
这可以按照以下方式完成。
words = ["foo", "ofo", "goo"]
target = "foo"
target_size = target.size
#=> 3
target_sorted = target.each_char.sort
#=> ["f", "o", "o"]
words.select { |w| anagram?(target_size, target_sorted, w) }
#=> ["foo", "ofo"]
编写anagram?
的典型方式是:
def anagram?(target_size, target_sorted, w)
return false unless w.size == target_size
w.each_char.sort == target_sorted
end
但是,我想知道它可能会更快:
target
i
w
w[i]
i #=> nil
),请返回false
true
则返回false
这可以这样实现:
def anagram?(target_size, target, w)
return false unless target.size == w.size
wcpy = w.dup
target.each_char do |c|
i = wcpy.index(c)
return false unless i
wcpy[i] = ''
end
true
end
words.select { |w| anagram?(target_size, target, w) }
#=> ["foo", "ofo"]
我将不得不对这两天进行基准测试。
我们也可以写:
def anagram?(w1, w2)
return false unless w1.size == w2.size
w1.chars.difference(w2.chars).empty?
end
帮助Array#difference
定义为here。
答案 1 :(得分:1)
如果数组中的所有字符串都是彼此的排列,那么:
words = ["foo", "ofo"]
str = "foo"
words[0].split("").sort == str.split("").sort