leetcode面试题 17.07. 婴儿名字。之前写过一篇根本不算HASH的HASH,现在借鉴了各位大神的UT哈希方法,把这个题目理一理。
思路如下:
1、通过info存取names的关键信息,本质就是比names多了cnt及root信息,用处是记录最终的cnt信息,以及给团队赋值为最小字典序(char *root)
2、通过hash存取names的关键信息,用处是支撑synonyms元素的快速查找对应索引位置HASH_FIND,将两个索引进行并查集处理
小知识点一:对字符串分割
names = [“John(15)”,“Jon(12)”,“Chris(13)”,“Kris(4)”,“Christopher(19)”]
synonyms = ["(Jon,John)","(John,Johnny)","(Chris,Kris)","(Chris,Christopher)"]
分割方法依次如下,其中对字符串的分割停止表达是:%[^ xxx], xxx就是想停止的字符
sscanf(names[i],"%[^(](%d)", info[i].name, &cnt);
sscanf(syn,"(%[^,],%[^)])", tmps[0], tmps[1]);
小知识点二:UT哈希方法
1、建立HASH
存放数据结构
typedef struct _info_st
{
char name[STR_LEN];
char *root;
int cnt;
}info_st;
typedef struct _hash_st
{
char *key;
int id;
UT_hash_handle hh;
}hash_st;
info_st *info;
hash_st *pool;
hash_st *head;
初始化
pool = (hash_st *)malloc(namesSize * sizeof(hash_st));
head = NULL;
2、查找&添加
遗留为什么这里用的HASH_FIND,如下链接总结了UT哈希
hash_st *new = &pool[psize];
new->key = info[i].name;
new->id = i;
hash_st *tmph;
HASH_FIND_STR(head, new->key, tmph);
if(tmph == NULL) {
HASH_ADD_KEYPTR(hh, head, new->key, tmplen, new);
psize++;
}
3、查找具体索引
hash_st *tmph;
HASH_FIND_STR(head, tmps[j], tmph