2013-07-23 84 views
2

我有两个字符串,ab,在Ruby中。检查两个字符串中的字符在Ruby中是相同的

a="scar" 
b="cars" 

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

UPDATE
我建立一个字谜游戏,所以疤痕是cars.So的字谜我希望有一个方法来比较A和B,并得出结论,其字谜
所以c="carcass"不应该是一个比赛

+4

你想如何? o处理重复的字符?例如'c =“胴体”',是a和b的匹配吗?事实上,你是否想要一个“真/假”响应,或者交叉口。你可以用代码输出示例输出,而不是模糊的“它应该说”吗? –

+0

http://stackoverflow.com/q/9646995/1301972或http://stackoverflow.com/q/16631961/1301972可能出现重复,或通过其答案之一回答。 –

+1

@CodeGnome正是我在找什么。其实我正在尝试手动创建hash当group_by已经在那里。红宝石roxx! – Stormvirux

回答

10

你可以这样做:

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

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

我认为'a.chars.sort.join == b.chars.sort.join'更好,因为比较数组比比较字符串更耗时。只是一个笔记;) –

+3

@YevgeniyAnfilofyev但这不是不平等;它是平等的。当两个数组包含不同的元素时,比较将终止。而'join'是一个额外的操作。你的索赔有数字基础吗? – sawa

+2

刚刚添加了一个帖子 –

1

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

已更新,以考虑来自sawa的评论

+0

当你的答案取决于一个图书馆,不要忽略它。 – sawa

+3

这不会处理带有重复字母的单词,因为一个单词会丢弃它们。 –

+0

@CodeGnome在发布此答案后添加了这项要求。提到的原始问题(现在还提到)“a'和'b'是否包含相同的字符”。 – sawa

3

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

为每Anagram的定义写在下面的代码应该工作:

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

你应该确定两个字符串的长度是相同的,否则在你的代码中'a =“scar”'和'b =“carse”'返回'true'。 –

+1

@YevgeniyAnfilofyev是的..那个OP没有放..如果字符串不具有相同的长度,它会失败..OP只是为了测试它们是否包含相同的章程。就是这样。 –

+1

但是对于现实世界,当您搜索字谜时,它会起作用,因为您可以在比较之前跳过长度不同的字词。所以 - +1 :) –

8

只是用于测试阵列VS串VS删除比较。假设我们比较长度相等的字符串。

在真正的anagram搜索中,您需要先排序第一个字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) 
+0

看到基准总是很好的。 –

+0

你可以将我的一个加入你的* benchmark *报告吗? :) –

+0

插入你的变种在第二benchmar。对于第一个基准来说,它是一样的。这是令人难以置信的更快;)需要调查'删除'的算法,然后... –

相关问题