#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
bool needSwap(char *beg, char *end)
{
for(char *tmp = beg; tmp != end; tmp++)
{
if(*tmp == *end)
return false;
}
return true;
}
void Permutation(char *str, char *beg)
{
if(*beg == '\0')
cout << str <<endl;
else
{
for(char *tmp = beg; *tmp != '\0'; tmp++)
{
if(needSwap(beg, tmp))
{
char c = *tmp;
*tmp = *beg;
*beg = c;
Permutation(str, beg+1);
c = *tmp;
*tmp = *beg;
*beg = c;
}
}
}
}
#if USE_ALGORITHM
/*
* implement by algorithm method : next_permutation()
* this method can handle repeat character by default.
*/
void Permutation(char *str, int len)
{
sort(str, str+len);
do{
cout << str << endl;
}while(next_permutation(str, str+len));
}
#endif
int main()
{
//char *str = "abc"; //"abc" is allocated as const
char str[] = "abb"; //"abc" is allocated in stack memory
Permutation(str);
return 0;
}
/*
* implement of next_permutation(), without using standard library of algorithm.
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <cassert>
#include <cstring>
#include <algorithm>
using namespace std;
void swap(char *a, char *b)
{
char c = *a;
*a = *b;
*b = c;
}
void reverse(char *beg, char *end)
{
while(beg < end)
swap(beg++, end--);
}
bool next_permutation(char *str)
{
assert(str != NULL);
char *p, *q, *find;
char *end = str + strlen(str) - 1;
p = end;
while(p != str)
{
q = p;
p--;
if(*p < *q)
{
find = end;
while(*find < *p)
{
find--;
}
swap(find, p);
reverse(q, end);
return true;
}
}
//reverse(p, end);
return false;
}
int cmp(const void *a, const void *b)
{
return *(char *)a - *(char *)b;
}
void Permutation(char *str)
{
qsort(str, strlen(str), sizeof(char), cmp);
do{
cout << str << endl;
}while(next_permutation(str));
}
int main()
{
char str[] = "abb";
Permutation(str);
return 0;
}