如何从字符串数组中收集所有可能的连续字符串连接?

时间:2016-08-04 07:17:42

标签: javascript arrays

我试图找到一种有效的方法从字符串数组中收集所有可能的连续字符串连接,不包括具有重复部分的字符串。示例:

var arr = [
        ["pq","bcd"], ["l", "ffnn", "xyz"], ["hm", "ffnn","ij"], ["ab","def","u","eeff"]
    ];
    function f(a) {
        var t = [];
        a[a.length-4].forEach(function(i) { 
            a[a.length-3].forEach(function(j) {
                if (j !== i) (
                a[a.length-2].forEach(function(k) {
                    if (k !== j && k !== i) (
                    a[a.length-1].forEach(function(l) {
                        if (l !== k && l !== j && l !== i) 
                        (t.push(i+","+j+","+k+","+l));
                    })
                    )
                })
                )
            })
        });
        return t;
    };
    console.log(f(arr));

结果将是

["pq, l, hm, ab"],
["pq, l, hm, def"],
//...and so on...
["bcd, xyz, ij, u"],
["bcd, xyz, ij, eeff"]

(请注意,虽然例如["pq, ffnn, ffnn, ab"]是可能的组合,但它不包含在结果中,因为它包含重复的内容。) 问题是我需要知道数组的长度并相应地编写多个嵌套函数。但我需要一些能自动检测长度的函数,并返回所需的结果。也许可以使用递归重写上面的函数,但我不确定这是否是解决此类问题的最佳方法。

2 个答案:

答案 0 :(得分:-1)

如果我理解正确,给定一组字符串数组n,您需要一个包含所有可能数组m的列表,以便

  1. 适用于所有im[i]n[i]
  2. 之一
  3. 适用于所有ij,如果i!= jm[i]!= m[j]
  4. 好吧,分成两半。

    首先,考虑给定一个字符串数组的函数combo,生成满足(1)的数组数组。你怎么写的?

    空输入数组上的

    combo生成一个只包含空数组的数组。

    非空输入数组上的

    combo可以通过" head" (数组的第一个元素),并依次应用头部中的每个字符串,并在" tail"上调用combo的返回值前置于每个数组。 (没有头部的其余输入)。

    现在浏览该列表并删除带有重复项的条目。

    修改:考虑到其他一些建议的Tolstoivian长度,我想我会发布我的答案,该答案使用Underscore库:

    
    
    const flatMap = (l, f) => _.flatten(_.map(l, f), true)
    
    const combo = a => a.length?
        (v => flatMap(_.head(a), e => v.map(g => [e].concat(g))))
          (combo(_.tail(a))):
        [[]];
    
    const allUniqueCombos = a => combo(a).filter(n => _.uniq(n).length == n.length)
    
    var arr = [["pq","bcd"], ["l", "ffnn", "xyz"], 
              ["hm", "ffnn","ij"], ["ab","def","u","eeff"]];
    
    console.log(JSON.stringify(allUniqueCombos(arr)))
    
    <script src="http://underscorejs.org/underscore.js"></script>
    &#13;
    &#13;
    &#13;

    (这远不是最有效地使用CPU - 但计算机程序员的成本远低于计算机程序员。)

答案 1 :(得分:-2)

你可以使用四个相互嵌套的for循环。

我设法得到它。 它应该适用于n子阵列。

如果它无法正常工作,请查看并告诉我。

var arr = [["pq","bcd"], ["l", "ffnn", "xyz"], ["hm", "ffnn","ij"], ["ab","def","u","eeff"]];
var length = arr.length;

var noDuplicate = function (arr, possibleDuplicate) {
    var arraySplit = arr.split(",")
    for (var i = 0; i < arraySplit.length; i++) {
        var arraySplitNoSpace = arraySplit[i].replace(' ', '');
        if (arraySplitNoSpace === possibleDuplicate) {
            return false;
        }
    }
    return true;
};


var createLoops = function(original, adaptedOriginal, index) { // createLoops(arr, 0, 0);

    var temporaryResults = [];
    var temporary = adaptedOriginal ? adaptedOriginal : original[0];

    for (var i = 0; i < temporary.length; i++) {
        for (var j = 0; j < original[index+1].length; j++) {
            if (noDuplicate(temporary[i], original[index+1][j])) {
                temporaryResults.push(temporary[i] + ", " + original[index+1][j]);
            };
        };
    };

    if (index === length-2) { 
        var results = [];
        for (var i = 0; i < temporaryResults.length; i++) {
            results.push("[" + temporaryResults[i] + "]");
        }
        return results;
    }

    else {
        return createLoops(original, temporaryResults, index+1);
    };
};

var result = createLoops(arr, 0, 0);
console.log("result: " + result);
console.log("result.length: " + result.length);