给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
思路一:排序后判断是否为异位词
int strCmp(const void *a, const void *b) {
char *aa = *(char**)a;
char *bb = *(char**)b;
int lena = strlen(aa);
int lenb = strlen(bb);
if (lena != lenb)
return lena - lenb;
int cnt[26] = {0};
int i;
for (i = 0; i < lena; i++) {
cnt[aa[i] - 'a']++;
cnt[bb[i] - 'a']--;
}
for (i = 0; i < 26; i++) {
if (cnt[i] != 0)
return cnt[i];
}
return 0;
}
char *** groupAnagrams(char ** strs, int strsSize, int* returnSize, int** returnColumnSizes){
if (strsSize == 0) {
*returnSize = 0;
return NULL;
}
char ***res = (char***)malloc(sizeof(char**) * strsSize);
*returnColumnSizes = (int*)malloc(sizeof(int) * strsSize);
int i = 0;
int j, k;
int idx = 0;
qsort(strs, strsSize, sizeof(strs[0]), strCmp);
while (i < strsSize) {
j = i + 1;
while (j < strsSize && strCmp(strs + i, strs + j) == 0)
j++;
res[idx] = (char**)malloc(sizeof(char*) * (j - i));
for (k = i; k < j; k++)
res[idx][k - i] = strs[k];
(*returnColumnSizes)[idx++] = j - i;
i = j;
}
*returnSize = idx;
return res;
}
分析:
本题需找出异位词,即将全部字母相同且个数相等的词找出,利用数组可将26位对应位置的数加一,再判断两个数组是否相同即可辨别异位词,利用qsort将异位词位置放置在一起,res数组将一类异位词放在一起,最后输出res
总结:
本题考察对字符串的应用,需找出异位词并将其分类放在数组的不同位置