给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
,
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
刚开始看到这题的时候真的是一脸懵逼,脑子里除了分箱完全没思路,然后要实现一大堆这个那个,想想就很乱,感觉自己像个弱智。
后来看到别人用java解题,顿时恍然大悟,就是个很简单的hash。。。
思路就是把字符串取出来排个序,作为key放到keys里,原字符串放到key对应的val里,如果keys里已有key,只要把原字符串放到key对应的val里。
不得不说,字符串方面JAVA比C语言方便太多了,每次定义一个字符串/字符串数组的时候都要给他分配内存(有些情况根本不知道该分配多大的好吗!!),不然等程序崩溃的时候根本想不起起来是哪儿跟哪儿了,IDE也不会报错。。。而如果直接给指针赋值的话就会出现很愚蠢的错误。。。然后strcmp strcpy这些函数真特么好用,为什么我以前都没用过他们。。。
代码:
/** * Return an array of arrays of size *returnSize. * The sizes of the arrays are returned as *columnSizes array. * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free(). */ int cmp(const void * a,const void *b) { return strcmp((char *)a,(char *)b) ; } int containKey(char **keys,char *key,int len) { int i; for(i=0;i<len;i++) { if(strcmp(keys[i],key)==0) return i; } return -1; } char*** groupAnagrams(char** strs, int strsSize, int** columnSizes, int* returnSize) { char **keys=(char **)malloc(sizeof(char *)*strsSize); char ***vals=(char ***)malloc(sizeof(char **)*strsSize); *columnSizes=(char *)malloc(sizeof(int)*strsSize); int len=0; int i; int pos; char *tmp=(char *)malloc(sizeof(char)*10); for(i=0;i<strsSize;i++) { keys[i]=(char *)malloc(sizeof(char)*10); (*columnSizes)[i]=0; } for(i=0;i<strsSize;i++) { strcpy(tmp,strs[i]); qsort(tmp,strlen(tmp),sizeof(char),cmp); pos=containKey(keys,tmp,len); if(pos==-1) { strcpy(keys[len],tmp); vals[len]=(char **)malloc(sizeof(char *)*strsSize); vals[len][(*columnSizes)[len]]=strs[i]; (*columnSizes)[len]++; len++; } else { vals[pos][(*columnSizes)[pos]]=strs[i]; (*columnSizes)[pos]++; } } *returnSize=len; return vals; }