打印下部套管绳的升级的所有排列

时间:2014-06-26 18:29:18

标签: ruby algorithm

我正在尝试在Ruby中打印出一个较低的套接字符串的所有upxased版本排列。例如:

原始字符串:aaa,

输出是:

AAA
AAA
AAA
AAA
AAA
AAA
AAA
AAA

非常感谢任何帮助或提示。

3 个答案:

答案 0 :(得分:3)

str = 'aaa'

(0...1<<str.length).map { |i|
    str.chars.map.with_index { |a,b| ((i>>b)&1).zero? ? a : a.upcase }.join
}

# => aaa Aaa aAa AAa aaA AaA aAA AAA

基本思想是n2**n == 1<<n)输出字符串的强大功能为n=str.length。因此,您可以使用从0到i的索引2**n-1作为要升级字母的位域。 E.g。

000 -> aaa
001 -> aaA
010 -> aAa
011 -> aAA
etc.

答案 1 :(得分:3)

您可以使用repeated_permutation做您想做的事情:

%w(a A).repeated_permutation(3).map(&:join)
# => ["aaa", "aaA", "aAa", "aAA", "Aaa", "AaA", "AAa", "AAA"]

对于任意字符串,您可以创建问题的排列是否要对该字母进行整理,例如:

str = 'abcde'
chars = str.chars

[false, true].repeated_permutation(str.length).map do |permutation|
  chars.zip(permutation).map do |char, upcase|
    upcase ? char.upcase : char
  end.join
end

# => ["abcde", "abcdE", "abcDe", "abcDE", "abCde", "abCdE", "abCDe", "abCDE", 
#     "aBcde", "aBcdE", "aBcDe", "aBcDE", "aBCde", "aBCdE", "aBCDe", "aBCDE",
#     "Abcde", "AbcdE", "AbcDe", "AbcDE", "AbCde", "AbCdE", "AbCDe", "AbCDE",
#     "ABcde", "ABcdE", "ABcDe", "ABcDE", "ABCde", "ABCdE", "ABCDe", "ABCDE"]

答案 2 :(得分:3)

我更喜欢@Uri针对特定情况的解决方案,但会建议使用小写字母的任意字符串:

str = "abad"

arr = str.chars.map { |c| [c,c.upcase] }
arr.shift.product(*arr).map(&:join)
  #=> ["abad", "abaD", "abAd", "abAD", "aBad", "aBaD", "aBAd", "aBAD",
  #    "Abad", "AbaD", "AbAd", "AbAD", "ABad", "ABaD", "ABAd", "ABAD"]