解题思路:
1,利用hash思想,遍历licensePlate,建立hash数组
2,依次遍历words中的每个单词,判断是否满足补全词
3,满足补全词则加入到定义的结构体中
4,对结构体中的len进行排序 取len最小的单词
代码简单易懂,如下
int LOWERWORD(int X)
{
if(X >= 'A' && X <= 'Z')
X -= 'A';
else if(X >= 'a' && X <= 'z')
X -= 'a';
return X;
}
struct wordmap
{
char *word;
int len;
};
int judge(int *oriHashArr,char *word)
{
int wordHashArr[26] = {0};
int i;
for(i=0; i<strlen(word); i++)
{
wordHashArr[word[i]-'a']++;
}
for(i=0; i<26; i++)
{
if(oriHashArr[i] != 0)
{
if(wordHashArr[i]==0 || wordHashArr[i] < oriHashArr[i])
return 0;
}
}
return 1;
}
int cmp(const void *a, const void *b)
{
return (*(struct wordmap*)a).len - (*(struct wordmap*)b).len;
}
char * shortestCompletingWord(char * licensePlate, char ** words, int wordsSize)
{
int oriHashArr[26] = {0};
int i,ret;
int k=0;
struct wordmap wordmapArr[1000];
for(i=0; i<strlen(licensePlate); i++)
{
if(licensePlate[i]>='a' && licensePlate[i]<='z' || licensePlate[i]>='A' && licensePlate[i]<='Z')
{
oriHashArr[LOWERWORD(licensePlate[i])]++;
}
}
for(i=0; i<wordsSize; i++)
{
ret = judge(oriHashArr,words[i]);
if(ret == 1)
{
wordmapArr[k].word = words[i];
wordmapArr[k].len = strlen(words[i]);
k++;
}
}
qsort(wordmapArr,k,sizeof(wordmapArr[0]),cmp);
return wordmapArr[0].word;
}
运行结果