原题:
Implement a magic directory with buildDict
, and search
methods.
For the method buildDict
, you'll be given a list of non-repetitive words to build a dictionary.
For the method search
, you'll be given a word, and judge whether if you modify exactly one character into another character in this word, the modified word is in the dictionary you just built.
Example 1:
Input: buildDict(["hello", "leetcode"]), Output: Null Input: search("hello"), Output: False Input: search("hhllo"), Output: True Input: search("hell"), Output: False Input: search("leetcoded"), Output: False
Note:
- You may assume that all the inputs are consist of lowercase letters
a-z
. - For contest purpose, the test data is rather small by now. You could think about highly efficient algorithm after the contest.
- Please remember to RESET your class variables declared in class MagicDictionary, as static/class variables are persisted across multiple test cases. Please see here for more details.
代码如下:
typedef struct {
char* string;
int len;
struct MagicDictionary* next;
} MagicDictionary;
/** Initialize your data structure here. */
MagicDictionary* magicDictionaryCreate() {
MagicDictionary* head;
head=(MagicDictionary*)malloc(sizeof(MagicDictionary));
head->next=NULL;
return head;
}
/** Build a dictionary through a list of words */
void magicDictionaryBuildDict(MagicDictionary* obj, char** dict) {
if(dict==NULL||*dict==NULL)
return;
//这个地方写的太脑残了
int dictLen=0;
char** q=dict;
while(*(q+dictLen)!=NULL)
{
dictLen++;
}
printf("%d",dictLen);
for(int n=0;n<dictLen;n++)
{
MagicDictionary* p;
p=(MagicDictionary*)malloc(sizeof(MagicDictionary));
int stringLen=strlen(*dict+n);
p->string=(char*)malloc(sizeof(char)*(stringLen+1));
strcpy(p->string,*(dict+n));
p->len=stringLen;
printf("%s",p->string);
p->next=obj->next;
obj->next=p;
}
}
/** Returns if there is any word in the trie that equals to the given word after modifying exactly one character */
bool magicDictionarySearch(MagicDictionary* obj, char* word) {
int wordLen=strlen(word);
MagicDictionary* p=obj->next;
while(p!=NULL)
{
if(p->len!=wordLen)
{
p=p->next;
}
else
{
int diff=0;
for(int n=0;n<p->len;n++)
{
if(*(word+n)!=*(p->string+n))
diff++;
}
if(diff==1)
return true;
else
{
p=p->next;
}
}
}
return false;
}
void magicDictionaryFree(MagicDictionary* obj) {
MagicDictionary* p=obj->next;
free(obj);
while(p!=NULL)
{
free(p->string);
MagicDictionary* temp=p;
p=temp->next;
free(temp);
}
}
/**
* Your MagicDictionary struct will be instantiated and called as such:
* struct MagicDictionary* obj = magicDictionaryCreate();
* magicDictionaryBuildDict(obj, dict);
* bool param_2 = magicDictionarySearch(obj, word);
* magicDictionaryFree(obj);
*/
我只能说leetcode对c太不友好了,欺负我们数据结构没有对应的属性或者函数是吧。。。
你tm让我怎么找二维数组的一维长度。。。。
难受。。。 搜了半天也没有好办法。