Permutations of Strings

  • + 0 comments
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void swap(char **a, char **b){
        char *temp = *a;
        *a = *b;
        *b = temp;
    }
    
    void reverse(char **s, int start, int end){
        while(start < end){
            swap(&s[start], &s[end]);
            start++;
            end--;
        }
    }
    
    int next_permutation(int n, char **s)
    {
        int i = n - 2;
        if(i < 0){
            return 0;
        }
        while(i >= 0 && strcmp(s[i], s[i + 1]) >= 0){
            i--;
        }
        if(i < 0){
            return 0;
        }
        int j = n - 1;
        while(strcmp(s[i], s[j]) >= 0){
            j--;
        }
        swap(&s[i], &s[j]);
        reverse(s, i + 1, n - 1);
        return 1;
    }
    
    int main()
    {
    	char **s;
    	int n;
    	scanf("%d", &n);
    	s = calloc(n, sizeof(char*));
    	for (int i = 0; i < n; i++)
    	{
    		s[i] = calloc(11, sizeof(char));
    		scanf("%s", s[i]);
    	}
    	do
    	{
    		for (int i = 0; i < n; i++)
    			printf("%s%c", s[i], i == n - 1 ? '\n' : ' ');
    	} while (next_permutation(n, s));
    	for (int i = 0; i < n; i++)
    		free(s[i]);
    	free(s);
    	return 0;
    }