题目:
题解:
#define MAXSIZE 769/* 选取一个质数即可 */
typedef struct Node
{char string[101];int index;struct Node *next; //保存链表表头
} List;typedef struct
{List *hashHead[MAXSIZE];//定义哈希数组的大小
} MyHashMap;List * isInHash(List *list,char * stringKey)
{List *nodeIt = list;//通过链表下遍历while (nodeIt != NULL) {if (strcmp(stringKey, nodeIt->string)== 0 ) {return nodeIt;}nodeIt = nodeIt->next;}return NULL;
}MyHashMap* myHashMapCreate()
{int i;MyHashMap* newHash= (MyHashMap* )malloc(sizeof(MyHashMap));/* 对链表的头结点赋初值 */for (i = 0; i < MAXSIZE; i++){newHash->hashHead[i] = NULL;}return newHash;
}int myHashID(char * str)
{long h = 0;for(int i = 0; i < strlen(str); i++){h = (h * 26 % MAXSIZE + str[i] - 'A') % MAXSIZE; // 字符串的hashcode, 权为26是因为小写字母,不限制时为128,这样能够让结点尽可能分布均匀,减少地址冲突// 取模是为了防止int型溢出}return h % MAXSIZE;
}void myHashMapPut(MyHashMap* obj, char* stringKey,int index)
{//一定不再这里面List * it= isInHash(obj->hashHead[myHashID(stringKey)],stringKey);if(it != NULL){//在表里面更新键值it->index = index;}else{//不在表里面List *newNode = (List*)malloc(sizeof(List));strcpy(newNode->string , stringKey);newNode->next = NULL;newNode->index = index;if(obj->hashHead[myHashID(stringKey)] != NULL){//当前头链表不为空,则需要将后续的链表接上//需要主要这里表头也代表一个数据的值newNode->next = obj->hashHead[myHashID(stringKey)];}//修改头链表obj->hashHead[myHashID(stringKey)] = newNode;}
}int myHashMapGet(MyHashMap* obj, char* stringKey)
{List * it= isInHash(obj->hashHead[myHashID(stringKey)],stringKey);if( it!= NULL){return it->index;}return -1;
}void myHashMapFree(MyHashMap* obj)
{int i;List *freeIt;List *curIt;for (i = 0; i < MAXSIZE; i++){if(obj->hashHead[i] != NULL){freeIt = NULL;curIt = obj->hashHead[i];while(curIt != NULL){freeIt = curIt;curIt= curIt->next;free(freeIt);}obj->hashHead[i]= NULL;}}free(obj);
}char ** findRepeatedDnaSequences(char * s, int* returnSize)
{char* stringKey = (char * )malloc(sizeof(char ) * 11);int len = strlen(s);if(len < 10){*returnSize = 0;return NULL;}MyHashMap * hsahMap = myHashMapCreate();int maxCount = 0;for(int i = 10; i <= len; i++){memcpy(stringKey, &s[i-10], 10);stringKey[10] = '\0';int count = myHashMapGet(hsahMap, stringKey);if(count == -1){count = 1;}else{count++;}myHashMapPut(hsahMap,stringKey,count);maxCount = fmax(maxCount, count);}if(maxCount < 2){*returnSize = 0;return NULL;}*returnSize = 0;char ** returnMatStr = (char ** )malloc(sizeof(char *) * len);int i;List *freeIt;List *curIt;for (i = 0; i < MAXSIZE; i++){if(hsahMap->hashHead[i] != NULL){freeIt = NULL;curIt = hsahMap->hashHead[i];while(curIt != NULL){freeIt = curIt;curIt= curIt->next;if(freeIt->index == maxCount){returnMatStr[*returnSize] = (char * )malloc(sizeof(char ) * 11);strcpy(returnMatStr[*returnSize], freeIt->string);*returnSize = *returnSize + 1;}free(freeIt);}hsahMap->hashHead[i]= NULL;}}free(hsahMap);return returnMatStr;
}