如何在Ruby中将字符串组合在一起

时间:2015-02-17 18:03:22

标签: ruby arrays

我正在尝试编写一个名为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

比较数组中的每个元素,但是我很难将它们全部组合在一个循环中。

4 个答案:

答案 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)