搞了老半天才弄懂题目意思,然后借鉴了大佬的代码,but还是有bug. 这道题用哈希列表或者字典树 会更加的稳固。
做题链接: 820.单词的压缩编码.
int cmp(char **a, char **b)
{
return(strlen(*b) - strlen(*a));
}
//此方法对于timeme me这种数据判断不准确。
int minimumLengthEncoding(char ** words, int wordsSize){
int i;
char str[16000] = {0}; /* 长度大于 2000 * 7 + 2000(#号) 即可 */
int cnt = 0;
char* tmp = NULL;
if (words == NULL || wordsSize == 0) {
return 0;
}
qsort(words, wordsSize, sizeof(words[0]), cmp); /* 按长度排序(从长到短),解决像【me, time】这种用例 */
for (i = 0; i < wordsSize; i++) {
/* strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。
如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;
否则,返回NULL。
*/
//判断单词是不是str的子串,是则显示后缀。例如:me是time#bell#的子串,则tmp=me#bell#
tmp = strstr(str, words[i]);
//tmp==null,说明words[i]不是str的子串;tmp!=null,即要去判断words[i]是否是已被编码单词的后缀
if (tmp == NULL || tmp[strlen(words[i])] != '#') {
cnt += sprintf(str + cnt, "%s#", words[i]);
}
}
return cnt;
}