力扣每日一题打卡 820.单词的压缩编码

搞了老半天才弄懂题目意思,然后借鉴了大佬的代码,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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值