List all permutations of a given string in dictionary order in C
Understanding String Permutations
String permutations refer to all possible arrangements of characters in a given string. The dictionary order means sorting them lexicographically.
We will explore three different methods to list all permutations of a given string in C.
Method 1: Using Recursion
This method generates permutations recursively by swapping characters.
#include <stdio.h>
#include <string.h>
void swap(char *x, char *y) {
char temp = *x;
*x = *y;
*y = temp;
}
void permute(char *str, int l, int r) {
if (l == r)
printf("%s\n", str);
else {
for (int i = l; i <= r; i++) {
swap((str + l), (str + i));
permute(str, l + 1, r);
swap((str + l), (str + i));
}
}
}
int main() {
char str[] = "abc";
permute(str, 0, strlen(str) - 1);
return 0;
}
Output: abc, acb, bac, bca, cab, cba
Method 2: Using Next Permutation Algorithm
This method generates permutations using the next permutation algorithm.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(char *)a - *(char *)b);
}
int next_permutation(char *str, int n) {
int i = n - 2;
while (i >= 0 && str[i] >= str[i + 1]) i--;
if (i < 0) return 0;
int j = n - 1;
while (str[j] <= str[i]) j--;
char temp = str[i];
str[i] = str[j];
str[j] = temp;
qsort(str + i + 1, n - i - 1, sizeof(char), compare);
return 1;
}
int main() {
char str[] = "abc";
int n = strlen(str);
qsort(str, n, sizeof(char), compare);
do {
printf("%s\n", str);
} while (next_permutation(str, n));
return 0;
}
Output: abc, acb, bac, bca, cab, cba
Method 3: Using Recursion with Sorting
This method generates and sorts permutations manually.
#include <stdio.h>
#include <string.h>
void swap(char *x, char *y) {
char temp = *x;
*x = *y;
*y = temp;
}
void permuteSorted(char *str, int l, int r) {
if (l == r)
printf("%s\n", str);
else {
for (int i = l; i <= r; i++) {
swap((str + l), (str + i));
permuteSorted(str, l + 1, r);
swap((str + l), (str + i));
}
}
}
int main() {
char str[] = "abc";
int n = strlen(str);
permuteSorted(str, 0, n - 1);
return 0;
}
Output: abc, acb, bac, bca, cab, cba