我正在尝试编写一个名为anagram()
的函数并返回以下输出:
Example = ['Creams', 'bart','bAtr', 'bar', 'rabt', 'Cars','creamsery', 'Scar', 'scream']
puts anagram(Example)
输出:
[["Creams", "scream"] ["bart", "bAtr", "rabt"], ["bar"], ["Cars","Scar"],["creamsery"]]
我知道我可以使用:
Example[i].downcase.char.sort.join
比较数组中的每个元素,但是我很难将它们全部组合在一个循环中。
答案 0 :(得分:0)
这个怎么样:
def anagram(ary)
ary.map do |el|
ary.select{ |x| el.downcase.chars.sort.join('') == x.downcase.chars.sort.join('') }
end.uniq
end
在.chars
上拨打String
将为您提供Array
个可以排序的字符,然后.join
返回String
。
您可以在控制台上尝试:
> ary = ['Creams', 'bart','bAtr', 'bar', 'rabt', 'Cars','creamsery', 'Scar', 'scream']
> anagram ary
=> [["Creams", "scream"], ["bart", "bAtr", "rabt"], ["bar"], ["Cars", "Scar"], ["creamsery"]]
当然,这不是特别优雅或高效。我渴望向别人学习。
答案 1 :(得分:0)
这个怎么样:
def anagrams(ary)
h = Hash.new([])
ary.each.with_index { |el, i| h[el.downcase.chars.sort.join] += [i] }
h.map { |key, indexes| indexes.map { |i| ary[i] } }
end
该函数将索引保存在哈希中,然后返回相应的元素。
这种方法最多扫描两次数组,因此它是O(n)。即使它不是特别优雅,它也很快。
答案 2 :(得分:0)
Example.group_by{|w| w.downcase.chars.sort}.values
答案 3 :(得分:0)
一个班轮 -
array.inject({}){|hash, ele| key = ele.chars.sort.join.downcase; hash[key] = (hash[key] || []) + [ele]; hash }.values
复杂性 - O(n * mlogm),其中 n =>元素数量, m =>字符串长度的最大大小。
如果 m 的值与 n 相比可忽略不计,那么复杂度将 O(n)