Time Complexity: O(n·n!)
def permute(s, path=""):
if not s:
print(path)
return
for i in range(len(s)):
permute(s[:i] + s[i+1:], path + s[i])
permute("123")
itertools.permutations (Python)from itertools import permutations
for p in permutations("123"):
print(''.join(p))
next_permutation (C++ STL)#include <bits/stdc++.h>
using namespace std;
int main() {
string s = "123";
sort(s.begin(), s.end()); // important
do {
cout << s << "\n";
} while (next_permutation(s.begin(), s.end()));
return 0;
}
#include <bits/stdc++.h>
using namespace std;
void permute(string &s, int idx) {
if (idx == s.size()) {
cout << s << "\n";
return;
}
for (int i = idx; i < s.size(); i++) {
swap(s[idx], s[i]);
permute(s, idx + 1);
swap(s[idx], s[i]); // backtrack
}
}
int main() {
string s = "123";
permute(s, 0);
}
def permute(s, idx=0):
if idx == len(s):
print(''.join(s))
return
for i in range(idx, len(s)):
s[idx], s[i] = s[i], s[idx]
permute(s, idx + 1)
s[idx], s[i] = s[i], s[idx]
permute(list("123"))
Time Complexity: O(n·2ⁿ) (There are 2ⁿ subsets, each takes O(n) to construct)
#include <bits/stdc++.h>
using namespace std;
int main() {
string s = "123";
int n = s.size();
for (int mask = 0; mask < (1 << n); mask++) {
string subset = "";
for (int i = 0; i < n; i++) {
if (mask & (1 << i)) {
subset += s[i];
}
}
cout << subset << "\n";
}
}
s = "123"
n = len(s)
for mask in range(1 << n):
subset = ""
for i in range(n):
if mask & (1 << i):
subset += s[i]
print(subset)
#include <bits/stdc++.h>
using namespace std;
void subsets(string &s, int idx, string curr) {
if (idx == s.size()) {
cout << curr << "\n";
return;
}
// exclude
subsets(s, idx + 1, curr);
// include
subsets(s, idx + 1, curr + s[idx]);
}
int main() {
string s = "123";
subsets(s, 0, "");
}
def subsets(s, idx, curr):
if idx == len(s):
print(curr)
return
subsets(s, idx + 1, curr) # exclude
subsets(s, idx + 1, curr + s[idx]) # include
subsets("123", 0, "")