工作问题和学习记录(八):LeetCode 76.最小覆盖字串 C语言实现 倒在了超出时间限制

7-22

今天在公司试着加强自己的解决问题的思维,也让自己周末不无聊,写了leetcode的76题,简单思考后,开始边写边测试。经过几次的逻辑错误后,最后倒在超出时间限制这个坑上面(主串10万个字符,难顶),尝试增加一些限制条件后,发现依旧不行,重新审视了自己写出的代码,应该是本身使用的解决方式本不行。于是就打住为止,毕竟脑子不得行,再慢慢锻炼吧0.o

 执行结果来看,大多数都通过了。但解决方法太笨了,所以不行吧。。

char * minWindow(char * s, char * t){
    //主串搜寻子串的指针
    unsigned int left, right, i;
    //int record[24] = {0};  //记录起始点(下标)和长度(值)
    char sonRe[128] = { 0 };
    char sonReTemp[128] = { 0 };
    
    int sonCnt = 0;
    char* retStr = NULL;
    int minRe = 9999;
    int minNo = 0;
    /*
    每轮 right  从left处移动并判断是否为字串中的字母,移动到最后,若没有则停止
    */
    int tlen = strlen(t);
    int slen = strlen(s);
    left = 0;  right = 0;  i = 0;

    for (i = 0; i < tlen; i++)
    {
        sonReTemp[t[i]]++;
    }

    while ((left <= slen - 1) || (slen - left >  tlen))
    {
        if (sonReTemp[s[left]] == 0)
        {
            left++;
            continue;
        }


        for (right = left; right < slen; right++)
        {
            if (sonReTemp[s[right]] == 0)
            {
                continue;
            }

            for (i = 0; i < tlen; i++)
            {
                if ((s[right] == t[i]) && (sonRe[s[right]] < sonReTemp[s[right]]))
                {
                    sonRe[t[i]]++;
                    sonCnt++;
                    break;
                }
            }

            if (sonCnt == tlen)
            {
                break;
            }
        }

        if (sonCnt < tlen)
        {
            break;
        }

        if (sonCnt == tlen)
        {
            //record[left] = (right - left);
            if ((right - left < minRe) && (right - left + 1  >= tlen))
            {
                minRe = right - left + 1;
                minNo = left;
            }
            sonCnt = 0;
        }

        left++;
        memset(sonRe,0,sizeof(sonRe));
    }

    if (minRe != 9999)
    {
        retStr = (char*)malloc((minRe + 1) * sizeof(char));

        //for (i = 0; i < minRe; i++)
        //{
        //    retStr[i] = s[i + minNo];
        //}
        memcpy(retStr,s + minNo, minRe);

        retStr[minRe] = '\0';
    }
    else
    {
        retStr = "";
    }

    return retStr;
}

写出的算法,很简单粗暴,就不显眼聊思考。如果有有缘人看了,有一些怎么做算法能力提升的方式,就在此求教了。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黯黯黯然了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值