TOP101题解 | BM58#字符串的排列#

字符串的排列

https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7

#include <stdlib.h>
#include <string.h>

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


/***************************************************************************
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * @param str string字符串 
 * @param start 还未排序的str数组 起始下标
 * @param end 还未排序的str数组 结束下标
 * @param result 结果数组,存放每一种可能性的指针 
 * @param returnSize 返回数组行数
 * @return string字符串一维数组
 * @return int* returnSize 返回数组行数
 *************************************************************************/
void backtrack(char* str, int start, int end, char*** result, int* resultSize) {
    if (start == end) 
    {
        char* temp = (char*)malloc( end * sizeof(char));
        strcpy(temp, str);
        (*result)[(*resultSize)] = temp;
        (*resultSize)++;
        return;
    }
    
    for (int i = start; i <= end; i++) 
    {
        // 剪枝:如果当前字符已经在当前位置选择过了,则不需要重复选择
        bool hasDuplicate = false;
        for (int j = start; j < i; j++) 
        {
            if (str[j] == str[i]) 
            {
                hasDuplicate = true;
                break;
            }
        }
        if (hasDuplicate) 
        {
            continue;
        }
        
        swap(&str[start], &str[i]);
        backtrack(str, start + 1, end, result, resultSize);
        swap(&str[start], &str[i]);
    }
}

/***************************************************************************
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * @author Senky
 * @date 2023.08.27
 * @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1
 * 
 * @param str string字符串 
 * @param returnSize 返回数组行数
 * @return string字符串一维数组
 * @return int* returnSize 返回数组行数
 *************************************************************************/
char** Permutation(char* str, int* returnSize)
{
    int len = strlen(str);
    int capacity = 1;
    for (int i = 1; i <= len; i++) 
    {
        capacity *= i;
    }
    
    char** result = (char**)malloc(capacity * sizeof(char*));
    *returnSize = 0;
    
    backtrack(str, 0, len - 1, &result, returnSize);
    
    return result;
}

#TOP101#
TOP101-BM系列 文章被收录于专栏

系列的题解

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务