2013-07-23 86 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。對於第一個基準來說,它是一樣的。這是令人難以置信的更快;)需要調查'刪除'的算法,然後... –

相關問題