一个类似于strstr的高效版本

时间:2011-07-18 01:29:16

标签: c string algorithm implementation

这是一般性实施

int stridx (char[] src, char[] str){
    int i,j,k;
    for(i=0;i < (src.len - str.len);i++){
      for(j=i,k=0; str[k] != '\0' && str[k] == src[i]; j++,k++);
      if( k> 0 && str[k]=='\0') return i;
    }
    return -1;
}

算法的最坏情况可能是n ^ 2,如果我们有aaaaaaaaaaaaaaaaaaaaaa(假设src和str都非常长,并且它们的长度非常接近)。

我可以有更好的算法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用Boyer-Moore算法,即O(n)。 Here's示例C代码。

答案 1 :(得分:0)

没有必要计算字符串的长度:

char *strr(char *s1,char *s2)
  {
    int i,j;
    for(i=0;s1[i];i++)
        if(s1[i]==s2[0])
            for(j=0;s1[i+j]==s2[j];j++)
                if(!s2[j+1]) return &s1[i];
    return NULL;
  }

答案 2 :(得分:0)

http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm是另一种线性时间算法。 OTOH,简单的算法保留,因为在实践中,它们对于人们实际搜索的大多数字符串来说都更快。