【问题标题】:C find all occurrences of substring [closed]C找到所有出现的子字符串[关闭]
【发布时间】:2012-11-20 21:31:19
【问题描述】:

是否有一种有效的方法可以在char *str1 中查找所有非 const char *str2 的出现(包括重叠),并在 C 中输出 str1 中匹配的数字位置(而不是在 C++ 中)不同)?

【问题讨论】:

  • 您需要重叠还是不重叠的出现?你知道strstr()吗?你试过什么?
  • 听起来你需要strstr()。
  • 我需要包含重叠,但我不知道 strstr() ;)
  • 我们所说的字符串有多长?如果它真的很长,您可能会考虑一些预处理以便之后快速操作。如果字符串不经常更改并且经常被查询,也是如此。
  • 如果str2 是常量并且您想在多个str1 中找到它,那么像Knuth-Morris-Pratt 或Boyer-Moore 这样的字符串搜索算法也可以胜过strstr如果您只扫描一个str1,则用于病理病例。

标签: c


【解决方案1】:

您的函数将在while 循环中使用strstr() 来查找str2str1 中的第一个匹配项。然后,您可以打印该匹配的偏移量。您将在匹配后的第一个字符处继续搜索。当strstr() 不再找到匹配项(由strstr() 返回NULL)时,您将停止循环。

如果您需要不重叠,则需要知道 str2 的长度,然后在匹配字符加上 str2 的长度开始下一次搜索。

【讨论】:

  • 没关系,但我正在寻找更有效的算法,例如后缀数组,因为str1 可以很长并且程序执行时间有限
  • 试试strstr();它可能很难被击败。至少在 Mac OS X 上,我在 C 语言中尝试过 BM 和 KMP,但在性能上并没有接近 strstr()。我既惊讶又失望。您是否正在对 ACGTAGGTCA 类型字符串进行“生物信息学”搜索?
【解决方案2】:

在循环中使用strstr()

int get_substr_count(const char * haystack, const char *needle)
{
    int count = 0;
    const char *tmp = haystack;
    while( tmp = strstr( tmp, needle)){
        printf( "Position: %d\n", (int)(tmp-haystack));
        ++count;
    }
    return count;
}

【讨论】:

  • 计算匹配;这与打印匹配的位置不同。
  • 你应该在 while 循环中增加 tmp,否则这段代码会进入无限循环,因为它一直从同一个索引搜索。
  • 你应该用 strlen(needle) 增加 tmp,因为在第一次出现 needle 之后,strstr 将返回 tmp 引用并进入无限循环。
猜你喜欢
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多