#include #include #include #include #include #include #include using namespace std; void do_permute(const string& pool, string& perm, vector& perms) { if (pool.empty()) { perms.push_back(perm); return; } size_t n = pool.size(); for (size_t i = 0; i < n; ++i) { string tmp; tmp.reserve(n-1); for (size_t j = 0; j < n; ++j) { if (i == j) perm.push_back(pool[j]); else tmp.push_back(pool[j]); } do_permute(tmp, perm, perms); perm.resize(perm.size()-1); // pop back one character. } } void permute(const string& pool) { vector perms; string perm; perm.reserve(pool.size()); do_permute(pool, perm, perms); cout << "number of permutations: " << perms.size() << endl; copy(perms.begin(), perms.end(), ostream_iterator(cout, "\n")); } int main(int argc, char** argv) { if (argc <= 1) return EXIT_FAILURE; size_t n = strlen(argv[1]); cout << "input string: " << argv[1] << " (len = " << n << ")" << endl; permute(string(argv[1],n)); return EXIT_SUCCESS; }