full permutation
bool _CanSwap(char* str, int start, int end) { while (start < end) { if (str[start++] == str[end]) { return false; } } return true; } void _Permutation(char* str, int start, int end) { if (start == end) { std::cout << str << std::endl; } else { for (int i = start; i <= end && _CanSwap(str, start, i); i++) { std::swap(str[start], str[i]); _Permutation(str, start + 1, end); std::swap(str[start], str[i]); } } } void PermutationWithRec(char* str) { _Permutation(str, 0, strlen(str) - 1); } bool _PermutationNoRec(char* str) { int len = strlen(str); for (int i = len - 2; i >= 0; --i) { if (str[i] < str[i + 1]) { for (int j = len - 1; j > i; --j) { if (str[j] > str[i]) { std::swap(str[i], str[j]); _strrev(str + i + 1); return true; } } } } _strrev(str); return false; } void PermutationNoRec(char* str) { std::sort(str, str + strlen(str)); do { std::cout << str << std::endl; } while (_PermutationNoRec(str)); }