我正在尝试获取一个七个字符的字符串并生成它所有可能的 3 和 4 字母排列。这似乎是递归可以派上用场的东西(我见过的大多数排列生成器都是递归的),但我一直被困在如何避免重复上。也就是说,如果我的输入字符串是“aabcdef”,我不希望任何排列包含两个以上的“a”字符。
非常感谢您提供的任何见解。
我正在尝试获取一个七个字符的字符串并生成它所有可能的 3 和 4 字母排列。这似乎是递归可以派上用场的东西(我见过的大多数排列生成器都是递归的),但我一直被困在如何避免重复上。也就是说,如果我的输入字符串是“aabcdef”,我不希望任何排列包含两个以上的“a”字符。
非常感谢您提供的任何见解。
这可以迭代和递归地完成。这是一个不错的排列生成器。这可以根据您的需要进行调整并使其通用(采用 a List<T>
of 元素),因此它可以采用数字列表、字符串(字符列表)等。
试着把角色想象成一堆角色中的元素。
这是一些应该可以工作的伪代码:
permute ( bag < character > : theBag, integer : length, string : resultSoFar )
if length <= 0 then:
print resultSoFar
exit
end-if
for each x in theBag:
nextResult = resultSoFar + x
nextBag = theBag - x
permute( nextBag, length - 1, nextResult )
end-for
end-method
祝你好运!
制作一个接受一组字母的函数,使其返回以您指定的字母开头的 n 个排列(3 或 4)的集合。然后为您集中的每个独特字符运行一次。
完整的结果集将是子集的并集。
这是一个可能有帮助的线索。如果您输入了“aabcdef”并且您不希望有两个“a”的排列,那么从输入中删除一个“a”比尝试消除带有多个“a”的排列更容易你生成它们。
这是在 Ruby 中,但它可能会有所帮助: http ://trevoke.net/blog/2009/12/17/random-constrained-permutations-in-ruby/
@ Chip Uni:当我实现你的代码时,它生成了长度为 x 到最大值的所有排列。因此,当我用一个包含 7 个字符的袋子喂它长度为 3 时,它会生成长度为 3 到 7 的所有排列。不过,消除所有大于长度 4 的结果是一件简单的事情。
非常感谢你们,你们!我非常感谢您的建议和帮助。