这题思路很清晰,但是要使用C语言原生的hash表相对比较困难,这里采用了C语言uthash函数库
思路:
依次使用字符串数组保存十个字符,存储到hash表当中,并判断是否有重复,如果有重复,将标记位置为1,并将该序列输出
困扰点:
一、解决返回双指针问题:定义一个指针数组,数组里面存放相应的字符串数组
二、结构体不能够初始化,所以标记位需要通过后面的赋值来实现
三、一个字符串数组结束的标志位‘\0’,需要多申请一个位置留给标志位
详见代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define MAX_SIZE 10000
//哈希表
struct hashmap{
//结构体声明不能初始化
char str[11];
int judge;
UT_hash_handle hh;
};
char *des[10000];
char ** findRepeatedDnaSequences(char * s, int* returnSize){
if(strlen(s) < 10){
*returnSize = 0;
return NULL;
}
struct hashmap *m = NULL;
char ch[11];
int md = 0;
for(int i = 0; i + 10 <= strlen(s); i++){
struct hashmap *tmp = NULL;
strncpy(ch, s+i, 10);
ch[10] = '\0';
HASH_FIND_STR(m, ch, tmp);
if(tmp == NULL){
tmp = (struct hashmap *)malloc(sizeof(struct hashmap));
strncpy(tmp->str, ch, 11);
HASH_ADD_STR(m, str, tmp);
}
else if(tmp -> judge != 1 && tmp != NULL){
des[md++] = tmp -> str;
tmp -> judge = 1;
}
else{
continue;
}
}
*returnSize = md;
return des;
}