我的 Ruby Anagram 无法正常工作
Posted
技术标签:
【中文标题】我的 Ruby Anagram 无法正常工作【英文标题】:My Ruby Anagram not working correctly 【发布时间】:2015-12-06 09:08:26 【问题描述】:我被分配写一个 Anagram 程序 以下是我想出的
class Anagram
attr_accessor :anagram_value
def initialize(value)
@anagram_value = value
end
def matches(*collection)
matches = []
matches = collection.select do |word|
(word.length == @anagram_value.length) ? is_an_anagram?(word) : false
end
return matches
end
def is_an_anagram?(word)
return get_word_ord_sum(word) == get_word_ord_sum(@anagram_value)
end
def get_word_ord_sum(word)
sum = 0
word.split("").each |c| sum += c.ord
Areturn sum
end
end
虽然上述情况使用以下情况,但令人惊讶的是。
it "detects multiple Anagrams" do
subject = Anagram.new("allergy")
matches = subject.matches('gallery', 'ballerina', 'regally', 'clergy', 'largely', 'leading');
expect(matches).to eq ['gallery', 'regally', 'largely']
end
它实际上失败了以下
it "no matches" do
subject = Anagram.new("abc")
matches = subject.matches("bbb")
expect(matches).to eq []
end
【问题讨论】:
【参考方案1】:问题是97 + 98 + 99 == 98 + 98 + 98
。也就是,字符数的总和不会唯一映射到给定字符串的直方图。
修复它的一种方法是将get_word_ord_sum
映射到其他东西。例如,"smallest" 字谜就可以了。但是,请注意它是O(nlgn)
:
word.chars.sort.join
编辑:扩展使用
Array#group_by
的想法,将get_word_ord_sum
替换为:
word.downcase.chars.group_by(&:itself)
现在您将获得类似直方图的哈希,并且由于比较哈希时键的顺序无关紧要,您将在O(n)
中获得所需的结果。
【讨论】:
是的..我知道..这就是我正在寻找的解决方案 @OyebanjiJacobMayowaPyJac,如果你已经知道了,为什么要说“令人惊讶”?无论如何,如果您想要O(n)
解决方案,只需使用 Array#group_by
并确保两个字符串的每个出现字符的计数相同。
请问,你能解释一下吗?
它适用于某些情况但失败了它“不区分大小写地检测字谜” do subject = Anagram.new("Orchestra");匹配 = subject.matches('cashregister', 'Carthorse', 'radishes') expect(matches).to eq ['Carthorse'] end
@OyebanjiJacobMayowaPyJac,你从来没有说过它应该不区分大小写。无论如何,我会添加String#downcase
,这将解决问题。【参考方案2】:
这可能会有所帮助。
words = ['demo', 'none', 'tied', 'evil', 'dome', 'mode', 'live',
'fowl', 'veil', 'wolf', 'diet', 'vile', 'edit', 'tide',
'flow', 'neon']
groups = words.group_by |word| word.split('').sort
返回组:
["d", "e", "m", "o"]=>["demo", "dome", "mode"], ["e", "n", "n", "o"]=>["none", "neon"], ["d", "e", "i", "t"]=>["tied", "diet", "edit", "tide "], ["e", "i", "l", "v"]=>["evil", "live", "veil", "vile"], ["f", "l", " o", "w"]=>["fowl", "wolf", "flow"]
groups.each |x, y| p y
返回每个值:
[“演示”、“圆顶”、“模式”]
[“无”,“霓虹灯”]
[“绑”,“饮食”,“编辑”,“潮”]
[“邪恶”、“活”、“面纱”、“卑鄙”]
[“鸡”、“狼”、“流”]
【讨论】:
以上是关于我的 Ruby Anagram 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章