我们有两个数组
char A[]="ABABABABBBABAB";
另一个是
char B[]="BABA";
我怎样才能在B
中找到A
,以及它在何处开始以及每次出现时的结束位置?
例如这个
Between 2-5
Between 4-7
Between 10-13
答案 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
专门用于needle
中haystack
的每个实例。
请注意,此插图代码显示了本身非重复的字符串示例。例如,在BB
中找到BBBBB
,然后我们会在每个位置找到每个匹配项。但上面的解决方案会跳过第二次。一个简单的修改是添加haystack
1
以比上一次迭代更早地搜索字符串一个字符。
更好的解决方案是使用KMP找到故障功能。这将提供更好的复杂性解决方案。 O(n+m)
。但在早先的案例中,它是O(n*m)
。