这是在编码问题中问我的,我给了一种丑陋的,虽然有效的解决方案。很想看到主人对这个问题的美妙解决方案。
给定一个包含字母和数字的字符串,即"abCd1_k"
,返回每个变体字符串的数组,其中字母的大小写已更改,即"AbCd1_k"
,"ABcd1_k"
....
一个更简单的问题案例然后'AbCd1_k'将是'ab',它应该返回 - >
['ab','ab','aB''AB']
在我看来,即使是最漂亮的解决方案,根据定义,仍然会有昂贵的时间复杂性。 (在最坏的情况下,每个角色可以有2种组合,这意味着2 ^ n增长)。即使这是真的,在Ruby中也必须有一种非常漂亮的方法。
答案 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