2

我正在尝试获取一个七个字符的字符串并生成它所有可能的 3 和 4 字母排列。这似乎是递归可以派上用场的东西(我见过的大多数排列生成器都是递归的),但我一直被困在如何避免重复上。也就是说,如果我的输入字符串是“aabcdef”,我不希望任何排列包含两个以上的“a”字符。

非常感谢您提供的任何见解。

4

6 回答 6

2

这可以迭代和递归地完成。这是一个不错的排列生成器。这可以根据您的需要进行调整并使其通用(采用 a List<T>of 元素),因此它可以采用数字列表、字符串(字符列表)等。

于 2009-11-13T23:54:10.883 回答
1

试着把角色想象成一堆角色中的元素。

这是一些应该可以工作的伪代码:

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

祝你好运!

于 2009-11-14T00:21:43.167 回答
0

制作一个接受一组字母的函数,使其返回以您指定的字母开头的 n 个排列(3 或 4)的集合。然后为您集中的每个独特字符运行一次。

完整的结果集将是子集的并集。

于 2009-11-13T23:49:28.867 回答
0

这是一个可能有帮助的线索。如果您输入了“aabcdef”并且您不希望有两个“a”的排列,那么从输入中删除一个“a”比尝试消除带有多个“a”的排列更容易你生成它们。

于 2009-11-14T00:09:06.180 回答
0

这是在 Ruby 中,但它可能会有所帮助: http ://trevoke.net/blog/2009/12/17/random-constrained-permutations-in-ruby/

于 2010-01-19T20:05:58.247 回答
0

@ Chip Uni:当我实现你的代码时,它生成了长度为 x 到最大值的所有排列。因此,当我用一个包含 7 个字符的袋子喂它长度为 3 时,它会生成长度为 3 到 7 的所有排列。不过,消除所有大于长度 4 的结果是一件简单的事情。

非常感谢你们,你们!我非常感谢您的建议和帮助。

于 2009-11-14T18:39:44.520 回答