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;
}