题解 | #字符串的排列#

字符串的排列

https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param str string字符串 
 * @return string字符串一维数组
 * @return int* returnSize 返回数组行数
 */
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
int compare (const void * a, const void * b)
{
  return ( *(char*)a - *(char*)b );
}
/**
参数列表:
    res:返回的结果集合
    str:原串
    returnSize:结果集合的长度
    tem:排序的字符串
    temlen:排序的字符串当前的长度
    flag:判断遍历到的当前元素是否加入排序串中
*/
void dfs(char* res[], char* str, int* returnSize, char tem[], int temlen, int flag[]) {
    //当前排序的元素和字符串一样长直接返回
    if (strlen(str) == temlen) {
        //开辟新空间存储该字符串
        char* new = (char*)malloc(sizeof(char) * temlen);
        for (int i = 0; i < temlen; i++) {
            new[i] = tem[i];
        }
        res[(*returnSize)++] = new;
        temlen = 0;
        return;
    }
    //递归筛选所有排列顺序
    for (int i = 0; i < strlen(str); i++) {
        //当前元素已添加到排列集合,跳过
        if (flag[i]) {
            continue;
        }
        //筛选排列顺序,避免重复
        if (i > 0 && str[i] == str[i - 1] && !flag[i - 1]) {
            continue;
        }
        tem[temlen++] = str[i];
        flag[i] = 1;
        dfs(res, str, returnSize, tem, temlen, flag);
        //不满足条件回溯
        flag[i] = 0;
        temlen--;
    }
}

char** Permutation(char* str, int* returnSize ) {
    // write code here
    if (str == NULL) {
        *returnSize = 0;  
        return NULL;
    }
    
    //字符串长度len
    int len = strlen(str);
    //最多可能出现size种排序情况
    int size = 1;
    for (int i = 1; i <= len; i++) {
        size *= i;
    }
    //flag数组判断字符串中的字符是否已经添加到排序集合中 0:否 1:是
    int flag[len];
    memset(flag, 0, 4 * len);
    //开辟数组长度为size的空间存储所有排序情况
    char** res = (char**)malloc(sizeof(char*) * size);
    //临时存储排序情况的数组
    char tem[len];
    //字符串排序
    qsort(str, len, sizeof(char), compare);
    dfs(res, str, returnSize, tem, 0, flag);

    return res;
}


#必刷题#
全部评论

相关推荐

程序员花海_:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务