JavaScript - 有没有办法找出给定字符是否包含在字符串中而没有循环?

时间:2017-10-19 08:15:26

标签: javascript jquery arrays algorithm

我有5个字符组合的数组(组合中的顺序不起作用):

AB,ABDE,CDE,C,BE ......

在此基础上,我需要验证用户的输入。输入的字符组合应包含在数组的一个组合中。 如果用户输入" ADE"或者" CE"结果应为yes,例如" BCE" - no

在一个简单的例子中,当输入的组合只匹配数组中的那个时,我可以使用.inArray。如果输入的组合由邻居组成,我可以.indexOf。如何在上面的情况下? 其中一个解决方案是通过包含所有可能的" child"来扩展初始数组。组合。还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

我能想到的第一件事就是用正则表达式匹配grep'ping数组。

var haystack = ["BCED","DBCE","CEB","ECBA","CB","BDCA"];
var needle = "CBE";
var re = new RegExp("(?=.*" + needle.split('').join(")(?=.*") + ").{" + needle.length+"}");
console.log(re);
console.log($.grep(haystack, function(str){
   return str.match(re,"g");
}));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 1 :(得分:1)

我将扩展我对上述问题所做的评论:如果您有少量固定集元素,则可以将这些集合表示为二进制掩码。所以说你把原始集合作为字符串:

var sset = ["AB", "ABDE", "CDE", "C", "BE"];

创建可能元素和位的字典。这些位是2的幂,可以通过位移创建:1 << n是位n

dict = {
    A: (1 << 0),
    B: (1 << 1),
    C: (1 << 2),
    D: (1 << 3),
    E: (1 << 4),
};    

然后可以使用该字典创建位掩码:

function bitmask(s, d) {
    let res = 0;

    for (let i = 0; i < s.length; i++) {
        res |= d[s[i]]
    }

    return res;
}

为包含蒙版的集创建伴随阵列:

var mset = sset.map(function(x) { return bitmask(x, dict); });

如果要检查输入,请先将其转换为遮罩,然后再运行检查。如果s

,则集x包含输入(s & x) == x的所有位
var s = "ADE";
var m = bitmask(s, dict);
for (let i = 0; i < mset.length; i++) {
    console.log(sset[i], s, (mset[i] & m) == m);
}

您可以将此策略用于以下几种情况:

(a & b) == b - b的所有元素都包含在a中; •(a & b) == 0 - ab没有共同元素;
(a & b) != 0 - b中至少有一个元素位于a;
a == b - 集ab相同。

在集合用语中a & b是交集,a | b是联合,a ^ bab的对称差异。

据我所知,jQuery是一个用Javascript编写的库,所以所有按位运算符都应该可用。