只要对字符串求出字典序即可实现全排列
求法:
要考虑全排列的非递归实现,先来考虑如何计算字符串的下一个排列。如"1234"的下一个排列就是"1243"。只要对字符串反复求出下一个排列,全排列的也就迎刃而解了。
如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"、"52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0、2都不行,5可以,将5和2交换得到"956220",然后再将替换点后的字符串"6220"颠倒即得到"950226"。
代码:
Prem( char *s ) //全排列函数
{
char *pEnd = s + strlen(s) - 1;
char *p = pEnd; //p代表替换点
//q代表替换点的下一个数 ,pMax 代表替换点后比替换点大的最小数
char *q = new char,*pMax = new char; //注意初始化!!!
while (p != s) //p == s 就结束循环
{
q = p;
p--;
if (*p < *q)
{
pMax = FindMaxForOne(p,pEnd); //找与替换点交换的点
Swap(p,pMax); //交换
Reverse(q,pEnd); //将替换点后所有数进行反转
Print(s); //输出
p = pEnd; //将替换点置最后一个点,开始下一轮循环
}
if (s == p) break; //结束条件
}
}