题目:给定一个字符串数组,将字母异位词分别放在一个数组内,返回的结果顺序不要求。
字母异位词:就是两字符串内容是一样的,只不过字母的排列顺序不同,如:"abc"和"bac"
栗子:
输入:strs=["china","hcina","chinese","anihc","best","chinsee"];
输出: [["china","hcina","anihc"],["chinese","chinsee"],["best"]]
输入:strs=["a"]
输出:[["a"]]
注意:
1<=strs.length<=10^4;
0<=strs[i].length<=100;
strs[i]仅仅包含小写字母
大家先根据题目的要求完成以下函数。
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
char *** groupAnagrams(char ** strs, int strsSize, int* returnSize, int** returnColumnSizes){
}
这道题虽然看起来有点点复杂,如果你是自己思考得出的结果,或许你会对hash表有进一步的了解。
答案:排序+hash
输入:strs=["beauty","bueaty"];
显然这两个字符串是字母异位词,判断是否为字母异位词就是判断它的内容是否是一样。为了方便去比较判断,我们先进行对字符串排序,排好序之后直接使用strcmp进行比较即可。
hash表结构:
排序代码:
![]()
解释:len是比较字符串的长度,tmp作用是记录未排序之前的字符串。
判断排好序的字符串在hash表中是否存在。
如果不存在,则将其加入hash表
![]()
![]()
解释:returnArr是返回数组。
如果存在的话,则在其字母异位字组后面继续添加
整体代码: