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

问题描述 投票:0回答:3

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

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

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

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

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

ruby
3个回答
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的项目。


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

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
© www.soinside.com 2019 - 2024. All rights reserved.