题目:
对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回-1
一开始看到这个题模就想到了书上的BF暴力搜索算法,虽然通过了但是很浪费时间。
然后学了一下kmp算法,觉得很高效。
//BF
int strStr(const char *source, const char *target) {
// write your code here
if((source == NULL) || (target == NULL))
{
return -1;
}
int lenghta = strlen(source);
int lengthb = strlen(target);
int i,j;i = j = 0;
while((source[i] != '\0') &&(target[j] != '\0'))
{
if(source[i] == target[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if(target[j] == '\0')
{
return i - j;
}
else
{
return -1;
}
}
KMP
void prehandle(const char *a,int b[])
{
int length = strlen(a);
int j = 0;
b[j] = -1;
int k = -1;
for(int i = 0;i < length;i++)
{
if(k == -1 || a[j] == a[k])
{
k++;
j++;
b[j] = k;
}
else
{
k = b[k];
}
}
}
int strStr(const char *source, const char *target) {
// write your code here
if((source == NULL) || (target == NULL))
{
return -1;
}
int ls,lt;
ls = strlen(source);lt = strlen(target);
if( lt == 0)
{
return 0;
}
int next[lt];
prehandle(target,next);
int i,j;i = j = 0;
while((source[i] != '\0') && (target[j] != '\0'))
{
if(source[i] == target[j])
{
i++;
j++;
}
else
{
j = next[j];
if(j == -1)
{
j++;
i++;
}
}
}
if(target[j] == '\0')
{
return i - lt;
}
else
{
return -1;
}
}
};
kmp 算法其实主要是比较是S[ i ]不变不用重新比较,而且T[ j ]也把重复的部分省去了。
该算法的难点在于当T[ j ]匹配失败后回溯到哪里。详见http://blog.youkuaiyun.com/starstar1992/article/details/54913261