我的 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 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 变量在函数中无法正常工作

Rails 测试无法正常工作

关于ruby.exe无法正常运行的问题

无法成功部署到 Beanstalk

为啥我的 javascript 在 github 页面上无法正常工作?

我的在线视频阅读器无法正常工作。有啥建议?