字谜分组

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

示例:

输入: ["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;
}

 

posted @ 2018-07-15 16:05  onlyandonly  阅读(176)  评论(0编辑  收藏  举报