这是一个非常紧凑的解决方案。它不会针对性能进行优化,从而对您提供的模式施加一些限制,例如,太多的通配符可能不是最好的主意。
下面的代码
input1 = "abc(ag)de*"
input2 = "abc(ag)de(mnlop)"
class Array
def append_suffixes!(suffixes)
self.replace suffixes.map { |a| self.map { |p| p + a }}.flatten
end
end
def generate_combinations(pattern)
combinations = [""]
pattern.scan(/\(([^)]+)\)|(\*)|(\w+)/) do |group,wildcard,other|
new_suffixes = case
when group : group.split('')
when wildcard : [*'a'..'z']
when other : other
else raise "Unknown match!"
end
combinations.append_suffixes! new_suffixes
end
combinations
end
p generate_combinations(input1)
p generate_combinations(input2)
p generate_combinations("**").size
运行上面的代码输出(略编辑):
["abcadea", "abcgdea", "abcadeb", "abcgdeb", "abcadec",
"abcgdec", "abcaded", "abcgded", "abcadee", "abcgdee",
"abcadef", "abcgdef", "abcadeg", "abcgdeg", "abcadeh",
"abcgdeh", "abcadei", "abcgdei", "abcadej", "abcgdej",
"abcadek", "abcgdek", "abcadel", "abcgdel", "abcadem",
"abcgdem", "abcaden", "abcgden", "abcadeo", "abcgdeo",
"abcadep", "abcgdep", "abcadeq", "abcgdeq", "abcader",
"abcgder", "abcades", "abcgdes", "abcadet", "abcgdet",
"abcadeu", "abcgdeu", "abcadev", "abcgdev", "abcadew",
"abcgdew", "abcadex", "abcgdex", "abcadey", "abcgdey",
"abcadez", "abcgdez"]
["abcadem", "abcgdem", "abcaden", "abcgden", "abcadel",
"abcgdel", "abcadeo", "abcgdeo", "abcadep", "abcgdep"]
676 # The number of two letter words i.e. 26*26
,请随时问,如果您对上面的代码中的任何问题。
“a”和“that”之间的标题中缺少一个词。我不知道什么是正确的单词(“字符串”?),所以你应该修复它;) – OregonGhost 2009-04-22 09:33:54
你可能会发现我在http://stackoverflow.com/questions/710670/c-permutation发布的C#答案数组列表/ 710716#710716有帮助。在你的情况下,数组就是那些你已经为第一个stask生成的数组。基本的递归算法应该相对容易转化为解决问题的方案。但我不认识Ruby,所以我把它留给你或别人。 – Brian 2009-04-22 16:04:25