我想在 ruby 中创建一个单词 unscambler。说如果我在数组中有一个词
words = ["foo","ofo"]
我如何将它与另一个字符串(如“oof”)进行比较并返回真值
最佳答案
这可以按如下方式完成。
words = ["foo", "ofo", "goo"]
target = "foo"
target_size = target.size
#=> 3
target_sorted = target.each_char.sort
#=> ["f", "o", "o"]
words.select { |w| anagram?(target_size, target_sorted, w) }
#=> ["foo", "ofo"]
anagram?
的典型写法是:
def anagram?(target_size, target_sorted, w)
return false unless w.size == target_size
w.each_char.sort == target_sorted
end
但是,我想知道这样做可能会更快:
- 遍历
target
的字符 - 在
w
中搜索匹配字符的索引i
- 如果找到匹配项,则删除
w[i]
- 如果没有找到匹配项(
i #=> nil
),返回false
- 如果之前没有返回
false
,则返回true
这可以这样实现:
def anagram?(target_size, target, w)
return false unless target.size == w.size
wcpy = w.dup
target.each_char do |c|
i = wcpy.index(c)
return false unless i
wcpy[i] = ''
end
true
end
words.select { |w| anagram?(target_size, target, w) }
#=> ["foo", "ofo"]
有一天我必须对这两个进行基准测试。
我们也可以这样写:
def anagram?(w1, w2)
return false unless w1.size == w2.size
w1.chars.difference(w2.chars).empty?
end
助手 Array#difference
定义为 here .
关于ruby - 如何检查两个字符串是否包含ruby中的相同字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29886736/