【问题标题】:Fastest way to check if string contains all substrings检查字符串是否包含所有子字符串的最快方法
【发布时间】:2016-03-23 22:45:17
【问题描述】:

Given 是一个包含子字符串的数组和一个字符串,我正在检查它是否包含所有子字符串。

我是否必须遍历元素并检查 indexOf >= 0 或者您有什么更酷的想法?因为我必须一遍又一遍地完成这项任务,任何性能优势都会有所帮助,提前感谢编程语言是 javascript

【问题讨论】:

  • 所有子串的大小都是偶然的吗?
  • 这不一样,但你想到了什么?只是好奇
  • 它取决于子字符串。您可以构建一个正则表达式并进行检查。

标签: javascript arrays algorithm validation


【解决方案1】:

你可以使用 Array.prototype.every(callback[, thisArg]);在此处阅读更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every

基本上,对于您的示例,它将是:

arr.every(function(element){
    return yourstring.indexOf(element) != -1;
});

返回值当然是真或假。

【讨论】:

  • 哦,因为您实际上希望它们都包含在您的字符串中,所以您实际上宁愿使用 != -1 对其进行测试(因为 indexOf 在未找到时返回 -1)。我现在就修改。
  • 这比检查 >= 0 更好吗?
  • 嗯,性能方面 != 和 >= 并没有真正产生可衡量的差异,因此请选择您认为更具可读性和直观性的任何内容。我编辑了那个,因为我用 == 0 将它与零进行了比较(我忘记了在 Javascript 中返回 -1 表示不匹配),这显然是一个错误。
【解决方案2】:

您正在寻找一个很酷的想法,并且真的有很多这样的子字符串要测试吗?

在性能方面,为您的字符串构建一个suffix tree 将是一个好主意,它的查找复杂性仅取决于子字符串的大小。

您将从简单的解决方案(如@BaneBojanić 的解决方案)的O(len(string) * len(substring) * N_substrings)1 降低到O(len(string) + len(substring) * N_substrings) 的复杂性。

1:假设indexOflen(string) * len(substring) 复杂度可能比that

【讨论】:

  • 数量不多,但它是一项重复性的任务,您能否为我进一步解释一下? :-)
  • @Skeec:你检查过维基百科链接了吗?我不会从那里重复所有内容:-)
  • 嗯,我想我明白了
  • 总是创建一个新的后缀树会很昂贵,因为它并不总是相同的字符串
  • 如果要检查的子字符串数组很大,是的,这可能仍然是一个好主意。创建树并不那么昂贵。如果您正在寻找实际速度,除了实施多种解决方案并使用您的实际数据对它们进行基准测试之外,您无能为力。
【解决方案3】:

您需要一个搜索finite set of patterns in one text 的算法。

拥有众多实现的最著名的是Aho–Corasick algorithm

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2011-11-09
    • 2013-05-18
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多