具有大写和小写字母的字符串的所有可能变体

这是在编码问题中问我的,我给了一种丑陋的,虽然有效的解决方案。 很想看到主人对这个问题的美妙解决方案。

给定一个包含字母和数字的字符串,即"abCd1_k" ,返回每个变量字符串的数组,其中字母的大小写已更改,即"AbCd1_k""ABcd1_k" ….

一个更简单的问题是’AbCd1_k’将是’ab’,它应该返回 – >

[‘ab’,’Ab’,’aB”AB’]

在我看来,即使是最漂亮的解决方案,根据定义,仍然会有昂贵的时间复杂性。 (最糟糕的是,每个角色可以有2种组合,这意味着2 ^ n的增长)。 即使这是真的,在Ruby中也必须有一种非常漂亮的方法。

这个怎么样:

 def case_permutations(string) string .each_char .reduce(['']) do |acc, char_string| acc.flat_map do |prefix| [char_string.upcase, char_string.downcase] .uniq .map do |modified_char| "#{prefix}#{modified_char}" end end end end 

你不会比(2 ^ n)* n时间复杂度做得更好,因为在最坏的情况下你的返回值将有2 ^ n个长度为n的项目。

 def case_combos(str) c = str.split('').map { |x| [x.upcase, x.downcase]} (0...1< 
 def every_combination(str = '') return unless str str.chars.permutation(str.size).map do |perm| perm_char_case_pair = perm.map do |c| [c.downcase, c.upcase] end perm_char_case_pair[0].product(*perm_char_case_pair[1..-1]).map(&:join) end.flatten.uniq end