对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1
。
考察基础编程的一道题,判断临界情况是个坑点
算法复杂度O(n^2)代码
int strStr(const char *source, const char *target) {
// write your code here
int i,j,ans=-1;
if(source==NULL||target==NULL){
return -1;
}
if(strlen(target)==0){
return 0;
}
for(i=0;i<strlen(source);i++){
if(source[i]==target[0]){
int k=i,flag=1;
for(j=0;j<strlen(target);j++,k++){
if(source[k]!=target[j]){
flag=0;
break;
}
}
if(flag!=0){
ans=i;
break;
}
}
}
return ans;
}
算法复杂度O(N) KMP算法代码
void getnext(const char *s, int *next)
{
int len = strlen(s);
next[0] = 0;next[1] = 0;
int i,j;
for(i = 1;i<len;i++)
{
j = next[i];
while(j!=0&&s[i]!=s[j])j = next[j];
next[i+1] = s[i] == s[j]?j+1:0;
}
}
int find(const char *T,const char *p, int *next)
{
int len = strlen(T),m = strlen(p);
int j = 0,i;
for(i = 0;i<len;i++)
{
while(j&&p[j]!=T[i])j = next[j];
if(p[j] == T[i])j++;
if(j == m)return i-m+1;
}
return -1;
}
int strStr(const char *source, const char *target) {
// write your code here
if(source==NULL||target==NULL)
return -1;
if(strlen(target)==0)
return 0;
int next[1000];
getnext(source,next);
int ans=find(source,target,next);
return ans;
}