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

时间:2014-06-19 04:08:01

标签: ruby

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

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

一个更简单的问题案例然后'AbCd1_k'将是'ab',它应该返回 - >

['ab','ab','aB''AB']

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

3 个答案:

答案 0 :(得分:5)

这个怎么样:

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的项目。

答案 1 :(得分:2)

def case_combos(str)
    c = str.split('').map { |x| [x.upcase, x.downcase]}
    (0...1<<str.size).to_a.map do |x|
        z = ""
        0.upto(c.size-1) do |y|
            z += c[y][0] if (1<<y)&x == 0
            z += c[y][1] if (1<<y)&x != 0
        end
        z
    end.uniq
end

答案 2 :(得分:0)

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