在另一个Array中查找一个数组

时间:2018-02-19 19:26:36

标签: c

我们有两个数组

char A[]="ABABABABBBABAB";

另一个是

char B[]="BABA";

我怎样才能在B中找到A,以及它在何处开始以及每次出现时的结束位置?

例如这个

Between 2-5
Between 4-7
Between 10-13

1 个答案:

答案 0 :(得分:1)

是的,您可以使用strstr功能执行此操作。

  

此函数返回指向在haystack中指定的任何整个字符序列中的第一个出现的指针,如果序列在haystack中不存在则返回空指针。

所以你会发现指针指向字符串的开头。但是如果你想找到下一个出现的话,你将再次更改第一个参数,省略找到第一个出现的部分。一个简单的例子: -

   char haystack[]="abismyabnameab";
   char needle[]="ab";
   char *ret;
   ret = strstr(haystack, needle);
   while(ret != NULL){
      /* do work */

      printf("%s (%zu,%zu)\n",ret, ret-haystack, ret-haystack+strlen(needle)-1 );
      ret = strstr(haystack+(ret-haystack)+1,needle);
   }   

我省略了那些计算出needle指数的部分。作为提示注意一件事 - 针的长度将为您所知,并且从哪里开始您知道使用strstr。 (ret - haystack专门用于needlehaystack的每个实例。

请注意,此插图代码显示了本身非重复的字符串示例。例如,在BB中找到BBBBB,然后我们会在每个位置找到每个匹配项。但上面的解决方案会跳过第二次。一个简单的修改是添加haystack 1以比上一次迭代更早地搜索字符串一个字符。

更好的解决方案是使用KMP找到故障功能。这将提供更好的复杂性解决方案。 O(n+m)。但在早先的案例中,它是O(n*m)