leetcode 49 字母异位词分组 C语言实现

题目

leetcode 49
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:
输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]

说明:
所有输入均为小写字母。
不考虑答案输出的顺序。

代码

代码思路:排序后的字符串相等的放在一起。
相当于暴力解决,不是很好,可以学习leetcode题解代码。

int cmp(const void *a, const void *b) {
    return *(char *)a - *(char *)b;
}
int isExist(char **flag, int len, char ass[]) {
    for (int i = 0; i < len; i++) {
        if (strcmp(ass, flag[i]) == 0) return i;
    }
    return -1;
}
char *** groupAnagrams(char ** strs, int strsSize, int* returnSize, int** returnColumnSizes){
    char ***res = (char ***)malloc(sizeof(char **) * strsSize);
    (*returnColumnSizes) = (int *)malloc(sizeof(int) * strsSize);
    char **flag = (char **)malloc(sizeof(char *) * strsSize);
    *returnSize = 0;
    int ch_max = 0;
    for (int i = 0; i < strsSize; i++) {
        res[i] = (char **)malloc(sizeof(char *) * strsSize);
        (*returnColumnSizes)[i] = 0;
    }
    for (int i = 0; i < strsSize; i++) {
        int ch_len = strlen(strs[i]);
        char *ass = (char *)malloc(sizeof(char) * (ch_len + 1));
        strcpy(ass, strs[i]);
        ass[ch_len] = '\0';
        qsort(ass, ch_len, sizeof(char), cmp);
        int ind = isExist(flag, *returnSize, ass);
        if (ind == -1) {
            flag[*returnSize] = ass;
            res[*returnSize][(*returnColumnSizes)[*returnSize]] = (char *)malloc(sizeof(char) * (ch_len + 1));
            strcpy(res[*returnSize][(*returnColumnSizes)[*returnSize]], strs[i]);
            res[*returnSize][(*returnColumnSizes)[*returnSize]][ch_len] = '\0';
            (*returnColumnSizes)[*returnSize]++;
            (*returnSize)++;
        } else {
            res[ind][(*returnColumnSizes)[ind]] = (char *)malloc(sizeof(char) * (ch_len + 1));
            strcpy(res[ind][(*returnColumnSizes)[ind]], strs[i]);
            res[ind][(*returnColumnSizes)[ind]][ch_len] = '\0';
            (*returnColumnSizes)[ind]++;
        }
    }
    return res;
}

你可能感兴趣的:(LeetCode)