【问题标题】:finding substrings within arrays - javascript在数组中查找子字符串 - javascript
【发布时间】:2017-04-07 04:14:09
【问题描述】:

我需要在数组中找到子字符串。 如果我有一个数组:["abc", "abcd", "abcde", "xyz"],该方法应该返回数组成员:"abc", "abcd", "abcde",因为每个都是另一个的子字符串或超字符串,但它应该排除“xyz”。 javascript中最好的方法是什么。

【问题讨论】:

  • 这个结果会是什么:['ab','abc','bc','abbc','bb','abb','ac','ababc',' abbbc','bbc'] - 期望的逻辑没有很好的定义
  • ['ab','abc','bc','abb','ababc','abbbc','bbc'],因为在这里你不会找到任何完全不同的字符串数组元素
  • 为什么不用bb?它是其他的子字符串
  • 你也可以,错过添加它
  • 为什么不abbcabbcabbc 的子字符串,对吧?

标签: javascript arrays string substring


【解决方案1】:

您可以使用一些带有快捷方式和对象的优化循环。

var data = ["abc", "abcd", "42", "abcde", "422", "xyz", "q", "1q"],
    result = function (array) {
        var i, j,
            r = {};

        for (i = 0; i < array.length - 1; i++) {
            if (r[array[i]]) {
                continue;
            }
            for (j = i + 1; j < array.length; j++) {
                if (r[array[j]]) {
                    continue;
                }
                if (array[i].indexOf(array[j]) !== -1 || array[j].indexOf(array[i]) !== -1) {
                    r[array[i]] = true;
                    r[array[j]] = true;
                }
            }
        }
        return array.filter(function (a) { return r[a]; });
    }(data);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    使用Array#filter

    var arr = ["abc", "abcd", "abcde", "xyz"];
    
    console.log(arr.filter(function(el) {
      return el.indexOf('abc') > -1;
    }));

    编辑:如果您想根据数组中的一些值对当前元素进行过滤,请使用Array#some

    var arr = ["abc", "abcd", "abcde", "xyz"];
    
    console.log(arr.filter(function(el, index) {
      return arr.some(function(e, i) {
        if (i !== index) {
          return e.indexOf(el) > -1 || el.indexOf(e) > -1;
        }
        return false;
      })
    }));

    【讨论】:

    • 这不是预期的,我需要动态比较每个元素与每个其他元素,看看哪些都在彼此之间有子字符串,您提供的解决方案会在每个数组元素中找到一个预先给定的文本跨度>
    • 谢谢,这是预期的结果,但无论如何将已经计算的值用于未来的检查,通过存储它们将有助于改善运行时间?
    • @ShyamSundarR — “已经计算出的值” 是什么意思?
    • 我的意思是如果我有一个长度为 100 的数组,我会找到前几个子/超级字符串,我可以进一步使用它们以动态减少所有比较
    • @ShyamSundarR — 但当前元素也可以是 super/sub 先前数组元素的字符串,对吧?
    【解决方案3】:

    你可以简单地使用2个嵌套循环,但是复杂度是O(n^2)

    function find_substrings(arr) {
        var res = [];
        for (var i=0; i<arr.length; i++) {
            for (var j=0; j<arr.length; j++) {
                if (i !== j && (arr[i].indexOf(arr[j]) > -1 || arr[j].indexOf(arr[i]) > -1)) {
                    res.push(arr[i]);
                    break;
                }
            }
        }
        return res;
    }
    var arr = ["abc", "abcd", "abcde", "xyz"];
    console.log(find_substrings(arr));
       

    【讨论】:

    • 您可以查看 xD 上方的已编辑答案。实际上它和我的答案一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2020-02-02
    • 2020-06-19
    • 2018-08-18
    • 2020-11-21
    • 2014-02-19
    相关资源
    最近更新 更多