mirror of
https://github.com/TheAlgorithms/C
synced 2025-02-12 19:44:30 +03:00
Create lexicographicPermutations.c
Program to print all possible Permutations of a string in Lexicographical order.
This commit is contained in:
parent
72e38936c2
commit
8d29a26105
53
misc/lexicographicPermutations.c
Normal file
53
misc/lexicographicPermutations.c
Normal file
@ -0,0 +1,53 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void swap(char* left, char* right){
|
||||
char temp = *left;
|
||||
*left = *right;
|
||||
*right = temp;
|
||||
}
|
||||
|
||||
int compare (const void * a, const void * b){
|
||||
return ( *(char*)a - *(char*)b );
|
||||
}
|
||||
|
||||
void PrintSortedPermutations(char str[])
|
||||
{
|
||||
int strSize = strlen(str);
|
||||
qsort(str, strSize, sizeof(char), compare);
|
||||
|
||||
int largerPermFound = 1;
|
||||
do{
|
||||
// 1. Print permutation
|
||||
printf("%s\n", str);
|
||||
// 2. Find rightmost char that is smaller than char to its right
|
||||
int i;
|
||||
for (i = strSize - 2; i >= 0 && str[i] >= str[i+1]; --i){}
|
||||
|
||||
// if we couldn't find one, we're finished, else we can swap
|
||||
if (i >= 0){
|
||||
// 3. find character at index j such that str[j] = min(str[k]) && str[k] > str[i] for all k > i
|
||||
int j = i+1, k;
|
||||
for(k=j; k<strSize && str[k]; k++){
|
||||
if (str[k] > str[i] && str[k] < str[j])
|
||||
j = k;
|
||||
}
|
||||
// 3. Swap chars at i and j
|
||||
swap(&str[i], &str[j]);
|
||||
// 4. Sort string to the right of i
|
||||
qsort(str+i+1, strSize-i-1, sizeof(char), compare);
|
||||
}
|
||||
else largerPermFound = 0;
|
||||
}
|
||||
while(largerPermFound);
|
||||
}
|
||||
|
||||
int main() {
|
||||
int n; //size of string
|
||||
scanf("%d\n",&n);
|
||||
char str[n];
|
||||
scanf("%s",str);
|
||||
PrintSortedPermutations(str);
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user