【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优势体现不出来,反而还慢了。。。
【代码还有一些小问题,等我解决了再发出来】