【问题标题】:Check the characters inside two strings are the same in Ruby检查两个字符串中的字符在Ruby中是否相同
【发布时间】:2013-07-22 15:22:57
【问题描述】:

我在 Ruby 中有两个字符串,ab

a="scar"
b="cars"

在 Ruby 中查找 ab 是否包含相同字符的最简单方法是什么?

更新
我正在构建一个字谜游戏,所以疤痕是汽车的字谜。所以我想要一种比较 a 和 b 并得出结论它是一个字谜
所以c="carcass"不应该匹配

【问题讨论】:

  • 你想如何处理重复的字符?例如c = "carcass",这与 a 和 b 匹配吗?事实上,你想要一个true/false 响应,还是交叉点。您能否在代码中给出示例输出而不是模棱两可的“它应该说”?
  • stackoverflow.com/q/9646995/1301972stackoverflow.com/q/16631961/1301972 的可能重复项,或由他们的答案之一回答。
  • @CodeGnome 正是我想要的。实际上,当 group_by 已经存在时,我正在尝试手动创建哈希。红宝石罗克斯!!
  • 应该ab 总是相同的大小? a 可以包含重复字符吗?在那种情况下,你会期待什么结果?

标签: ruby


【解决方案1】:

你可以这样做:

a = 'scar'
b = 'cars'
a.chars.sort == b.chars.sort
# => true

a = 'cars'
b = 'carcass'
a.chars.sort == b.chars.sort
# => false

【讨论】:

  • 我认为a.chars.sort.join == b.chars.sort.join 更好,因为数组的比较比字符串的比较更耗时。只是一个注释;)
  • @YevgeniyAnfilofyev 但这不是不平等;这是平等。当两个数组包含不同的元素时,比较将终止。而join 是一个额外的操作。您的主张有数字依据吗?
【解决方案2】:

仅用于测试数组与字符串与删除比较。假设我们比较长度相等的字符串。

在真正的字谜搜索中,您需要对第一个单词a 进行一次排序。然后将其与一堆 b 进行比较。

a="scar"
b="cars"

require 'benchmark'

n = 1000000
Benchmark.bm do |x|
  x.report('string') { a = a.chars.sort.join; n.times do ; a == b.chars.sort.join ; end }
  x.report('arrays') { a = a.chars.sort; n.times do ; a == b.chars.sort ; end }
end

结果:

          user     system      total        real
string  6.030000   0.010000   6.040000 (  6.061088)
arrays  6.420000   0.010000   6.430000 (  6.473158)

但是,如果您每次都对a 进行排序(对于delete,我们不需要对任何单词进行排序):

x.report('string') { n.times do ; a.chars.sort.join == b.chars.sort.join ; end }
x.report('arrays') { n.times do ; a.chars.sort == b.chars.sort ; end }
x.report('delete') { n.times do ; a.delete(b).empty? ; end }

结果是:

          user     system      total        real
string 11.800000   0.020000  11.820000 ( 11.989071)
arrays 11.210000   0.020000  11.230000 ( 11.263627)
delete  1.680000   0.000000   1.680000 (  1.673979)

【讨论】:

  • 在第二个基准测试中插入了您的变体。对于第一个基准,它是相同的。它的速度快得令人难以置信;)需要研究delete的算法然后......
  • delete 无论如何都不能正确处理重复项
【解决方案3】:

在 Ruby 中找出 a 和 b 是否包含相同字符的最简单方法是什么?

根据Anagram 的定义,以下编写的代码应该可以工作:

a="scar"
b="cars"
a.size == b.size && a.delete(b).empty?

【讨论】:

  • 您应该确保两个字符串的长度相同,否则a="scar"b="carse" 在您的代码中返回true
  • @YevgeniyAnfilofyev 是的..那个OP没有放..如果字符串的长度不同,它会失败..OP只说测试它们是否包含相同的章程..就是这样它。
  • 但是对于现实世界,当您搜索字谜时,它会起作用,因为您可以在比较之前跳过不同长度的单词。所以——+1 :)
  • @YevgeniyAnfilofyev 那么a.size == b.size && a.delete(b).empty?
  • 这不适用于重复的字母,例如“abb”和“baa”
【解决方案4】:

require 'set'
Set.new(a.chars) == Set.new(b.chars)

已更新以考虑来自 Sawa 的评论

【讨论】:

  • 当你的答案依赖于一个库时,不要忽略它。
  • 这不会处理带有重复字母的单词,因为集合会丢弃它们。
  • @CodeGnome 该要求是在发布此答案后添加的。最初提到的问题(现在仍然提到)“ab 是否包含相同的字符”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多