检查字符串是否可用更长的100,000字符串

时间:2012-09-21 18:28:08

标签: java c++ string

  

可能重复:
  What is the fastest substring search algorithm?

如何检查字符串是否存在于C ++或Java中长度为100,000个字符的较大字符串中?

我知道一个方法str.find("sub_string");,但它无法处理这么大的字符串。 最长执行时间为1秒。

我需要寻找的子字符串也可以是50,000!

4 个答案:

答案 0 :(得分:5)

在C或C ++中,您只需使用malloc即可获得100,000字节的块。填写您的数据。要在大海捞针中找到针,可以使用以下代码:

void *mem_mem(void *haystack, int haystack_len, void *needle, int needle_len)
{
  const char *begin;
  const char *const last_possible
    = (const char *) haystack + haystack_len - needle_len;

  if (needle_len == 0)
    return (void *) &((const char *) haystack)[needle_len - 1];

  for (begin = (const char *) haystack; begin <= last_possible; ++begin)
    if (begin[0] == ((const char *) needle)[0] &&
    !memcmp ((const void *) &begin[1],
         (const void *) ((const char *) needle + 1),
         needle_len - 1))
      return (void *) begin;

  return NULL;
}

在任何合理的现代平台上,这将在很短的时间内找到100,000字节的任何子字符串。您可以将其修改为简单地使用char *类型。如果您在同一个大海捞针中进行多次搜索,请尝试仅计算一次干草堆长度。当您不需要时,请不要致电strlen

如果您的草垛包含许多重复的针头的第一个字符或多个字符,那么这将是非常不理想的。例如,在“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqa ...”中搜索“ab”(或者更糟糕的是,在“abababababababab ... abc ......”中搜索“abc”)将会很慢。但是你没有给我们足够的细节来确定最佳实施方案。

问题的关键在于编写具有最佳可能最差情况性能的算法。如果是这样,这可能不是“正确”的答案。人们可以想象一个大海捞针,最后是一个b,一个针由所有a组成,后面跟着一个b。在这种情况下,此算法可能需要很长时间。

答案 1 :(得分:4)

这在我的第一代英特尔iMac上几乎立即(4毫秒)完成。我将搜索字符串放在两个100,000个字符的块之间,以防java向后搜索。

StringBuilder builder = new StringBuilder();
for (int i = 0; i < 100000; i++) {
    builder.append((char) i);
}
builder.append("sub_string");
for (int i = 0; i < 100000; i++) {
    builder.append((char) i);
}
String maxString = builder.toString();
long t1 = System.currentTimeMillis();
System.out.println(maxString.contains("sub_string"));
long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);

输出

true
4

答案 2 :(得分:1)

假设java:

String.contains("stringtofind");

是一种查找字符串是否存在于另一个字符串javadoc中的方法。

答案 3 :(得分:1)

以java三种方式查找String内容。

String.contains("charSequence");
String.contentEquals("charSequence");
String.contentEquals("StringBuffer"); 

您可以通过Java规范获得最大长度为Integer.MAX_VALUE的字符串(始终为2147483647 (2^31 - 1))。