如何检查两个字符串是否在ruby中包含相同的字符

时间:2015-04-27 03:34:25

标签: ruby

我想在红宝石中说一句不容易的话。如果我在数组中有一个单词

 words = ["foo","ofo"]

如何将此与另一个字符串(如“oof”)进行比较并返回真值

2 个答案:

答案 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