/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param str string字符串 
 * @return string字符串一维数组
 * @return int* returnSize 返回数组行数
 */

void swap(char* a, char* b) {
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

void permute(char* str, int start, int end, char** result, int* returnSize) {
    if(start == end) {
        result[*returnSize] = (char*)malloc((end + 1) * sizeof(char));
        strcpy(result[*returnSize], str);
        (*returnSize)++;
    } else {
        int shouldSwap = 1;
        for(int i = start; i <= end; i++) {
            shouldSwap = 1;
            for(int j = start; j < i; j++) {
                if(str[j] == str[i]) {
                    shouldSwap = 0;
                    break;
                }
            }
            if(shouldSwap) {
                swap(&str[start], &str[i]);
                permute(str, start + 1, end, result, returnSize);
                swap(&str[start], &str[i]);
            }
        }
    }
}


char** Permutation(char* str, int* returnSize ) {
    // write code here
    int len = strlen(str);
    if(str == NULL || len == 0) {
        *returnSize = 0;
        return NULL;
    }

    int totalPermutations = 1;
    for(int i = 1; i <= len; i++) {
        totalPermutations *= i;
    }

    char** result = (char**)malloc(totalPermutations * sizeof(char*));
    *returnSize = 0;
    permute(str, 0, len - 1, result, returnSize);
    return result;
}