LintCode 13字符串查找

对于一个给定的 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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值