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

标签 ruby

我想在 ruby​​ 中创建一个单词 unscambler。说如果我在数组中有一个词

 words = ["foo","ofo"]

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

最佳答案

这可以按如下方式完成。

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的字符
  • w 中搜索匹配字符的索引 i
  • 如果找到匹配项,则删除 w[i]
  • 如果没有找到匹配项(i #=> nil),返回false
  • 如果之前没有返回false,则返回true

这可以这样实现:

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 .

关于ruby - 如何检查两个字符串是否包含ruby中的相同字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29886736/

相关文章:

ruby-on-rails - Rails 5 测试 NoMethodError

Ruby:如何将多个数字相乘?

ruby-on-rails - rails : link_to into another controller with params

ruby - 为什么 Ruby setter 返回传递的值,而不是实例变量的最终值?

ruby-on-rails - "Gamification" gem ?

ruby - 线程死锁

ruby - 有没有办法离线更新 RubyGems?

ruby - 在 heroku 的静态网站中加载 css 文件

ruby - 如何将字符串格式的毫秒数转换为 HH :MM:SS format in Ruby in under 3 lines of code?

ruby - "Personal"ruby​​ 中的方法