转载自:http://blog.csdn.net/roynee/archive/2009/06/28/4304796.aspx
[问题描述]: 输出字符串的所有全排列,要求无重复字符串出现
[问题解决]:改算法的思想是从字符串排列的最小字符串出发,找到小一个比该字符串大的数据。
先对字符串排序,得到最小的排列串,然后
从字符串尾部开始找第一个string[frontPos]<string[frontPos+1]的字符,定位forontPos
然后从字符串的尾部开始找第一个比string[frontPos]大的字符string[tailPos],定位tailPos
交换string[frontPos]和string[endPos], 然后 将string[frontPos+1]到string[len-1]的所有字符反序
即得下一个字符(较前一个字符串大)
如果得到的是最大的,即找不到比该字符串更到的字符串,该字符串一定是逆序排列的最大字符串
该算法,避免了重复字符串出现的问题。是个比较好的非常不错的典型算法,有那么丁点快排的味道。
递归的算法,可能处理重复的问题比较麻烦,如果不用STL的SET。
PS: 还有一种递归方式处理的,不过这个简单的递归只能处理所有字符都不同的
全排列,如果有两个字符相同的话,得出来的结果就不正确了。
原理:
E = {e1, e2, e3...en}n个元素的集合
Perm(X)表示集合X中元素的排列方式
ei.Perm(X)表示Perm(X)的每个排列方式的前面加上ei以后得到的排列方式
eg: E={a,b,c}, E1 = {b,c} Perm(E1) = {bc,cb}
e1.Perm(E1) = {abc,acb}
当n = 1时,只有一个元素,只能产生一种排列 Perm(E) = {e}
当n > 1时,
Perm(E) = e1.Perm(E1) + e2.Perm(E2)+...+en.Perm(En)