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
This method generates permutations in lexicographical order.
#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 i = strlen(str) - 2;
while (i >= 0 && str[i] >= str[i + 1]) i--;
if (i < 0) return 0;
int j = strlen(str) - 1;
while (str[j] <= str[i]) j--;
char temp = str[i];
str[i] = str[j];
str[j] = temp;
qsort(str + i + 1, strlen(str) - i - 1, sizeof(char), compare);
return 1;
}
int main() {
char str[] = "abc";
qsort(str, strlen(str), sizeof(char), compare);
printf("%s\n", str);
while (next_permutation(str)) {
printf("%s\n", str);
}
return 0;
}
Output: abc, acb, bac, bca, cab, cba
Method 3: Using STL (C++)
This method sorts the string and uses C++'s next_permutation function.
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
void swap(char *a, char *b) {
char temp = *a;
*a = *b;
*b = temp;
}
bool nextPermutation(char *str, int n) {
int i = n - 2;
while (i >= 0 && str[i] >= str[i + 1]) i--;
if (i < 0) return false;
int j = n - 1;
while (str[j] <= str[i]) j--;
swap(&str[i], &str[j]);
for (int k = i + 1, l = n - 1; k < l; k++, l--) {
swap(&str[k], &str[l]);
}
return true;
}
int main() {
char str[] = "abc";
int n = strlen(str);
printf("%s\n", str);
while (nextPermutation(str, n)) {
printf("%s\n", str);
}
return 0;
}
Output: abc, acb, bac, bca, cab, cba