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系列 文章被收录于专栏
系列的题解

