【字符串】实现strstr()函数。(C语言)(暴力优化+KMP)

在这里插入图片描述
【find the needle in haystack就是大海捞针的意思】
二话不说,直接先试试看O(M*N)的暴力法,看看可不可以:

#include<string.h>

int strStr(char * haystack, char * needle){
    int len_h=strlen(haystack);
    int len_n=strlen(needle);

    if (len_n==0)     return 0;
    if (len_h<len_n)  return -1;

    int i,j;
    for(i=0; i<=len_h-1; i++)
    {
        if (haystack[i]==needle[0])
        {   
            int temp=i;
            int flag=0;
            for(j=0; j<=len_n-1; j++)
            {
                if (needle[j]==haystack[temp])  temp++;
                    else    flag=1;
            }
            if (flag==0)    return i;
        }
        else  continue;
    }

    return -1;
}

我有预感会“时间超限”的,果不其然:
在这里插入图片描述
但是,这个时候,我突然看到了下面评论区有这样一楼:
在这里插入图片描述
暴力求解过了?为啥我这个不行呢?我想了想,要不优化一下,省去一些没必要的步骤,可能可以通过?然后,我做了这样一个微小的改进:加了一个break:

for(j=0; j<=len_n-1; j++)
            {
                if (needle[j]==haystack[temp])   temp++;
                    else   
                    {
                        flag=1;
                        break;  //<-------添加的在这里!
                    } 
            }

然后就通过了(虽然内存和时间都很差劲):
在这里插入图片描述
尝试着剥离一些特殊情况,不让他们参与循环,会不会再快一些呢?

    if (len_h==len_n)
    {
        for (int i=0; i<=len_h; i++)
        {
            if (haystack[i]!=needle[i])  return -1;
        }
        return 0;
    }

结果是稍微快了那么一点点:
在这里插入图片描述
可见,单独拿出来一些特殊情况然后降低这些情况的复杂度,整体的复杂度也会下降,是一个有效的方法!


但是,岂能止步于此。上面的评论说KMP算法不通过,我就不相信了,怎么可能不通过?我自己来试试。
了解KMP算法点这里!
在这里插入图片描述
好吧,字符串都比较短小,KMP优势体现不出来,反而还慢了。。。
【代码还有一些小问题,等我解决了再发出来】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值