void Permutation(char* pStr, char* pBegin)
{
assert(pStr && pBegin);
if(*pBegin == '\0')
printf("%s\n",pStr);
else
{
for(char* pCh = pBegin; *pCh != '\0'; pCh++)
{
swap(*pBegin,*pCh);
Permutation(pStr, pBegin+1);
swap(*pBegin,*pCh);
}
}
}
重复数的全排列
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
//在pszStr数组中,[nBegin,nEnd)中是否有数字与下标为nEnd的数字相等
bool IsSwap(char *pszStr, int nBegin, int nEnd)
{
for (int i = nBegin; i < nEnd; i++)
if (pszStr[i] == pszStr[nEnd])
return false;
return true;
}
//k表示当前选取到第几个数,m表示共有多少数.
void PermutationHaveSameword(char *pszStr, int k, int m)
{
if (k == m)
{
static int s_i = 1;
printf(" 第%3d个排列\t%s\n", s_i++, pszStr);
}
else
{
for (int i = k; i <= m; i++) //第i个数分别与它后面的数字交换就能得到新的排列
{
if (IsSwap(pszStr, k, i))
{
swap(pszStr[k], pszStr[i]);
PermutationHaveSameword(pszStr, k + 1, m);
swap(pszStr[k], pszStr[i]);
}
}
}
}
int main(void)
{
char str[] = "aba";
PermutationHaveSameword(str, 0, sizeof(str) - 2);
//Combination(str);
//Permutation(str, 0, sizeof(str) - 1);
return 0;
}