2017-10-19 56 views
0

我有5個字符組合的陣列(順序的組合內起着無作用):JavaScript - 有沒有辦法找出給定的字符是否包含在沒有循環的字符串中?

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

在其基礎我需要驗證輸入來自用戶。輸入的字符組合應包含在數組的其中一個組合中。 如果用戶輸入「ADE」或「CE」,結果應該是yes,例如, 「BCE」 - no

在一個微不足道的情況下,當輸入組合簡單地匹配數組中的一個時,我可以使用.inArray。如果輸入的組合由鄰居組成,我可以做.indexOf。如何在上面的情況? 其中一個解決方案是通過包含所有可能的「子」組合來擴展初始數組。有其他選擇嗎?

+0

不確定邏輯是什麼? 「當輸入的組合與數組中的數字簡單匹配時」的預期結果是什麼? – guest271314

+0

如果輸入的組合是數組,則結果爲正數,輸入有效,是。這就是我所說的一個微不足道的情況。 –

+0

你的意思是如果輸入「AB」和「D」,結果應該是「yes」?作爲一個匹配在數組中找到?目前還不清楚預期的輸入,匹配邏輯或結果是什麼。你能否包含你試圖通過問題解決問題的代碼?請參閱https://stackoverflow.com/help/mcve – guest271314

回答

1

我能想到的第一件事是用正則表達式匹配grep'數組。

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

我會擴大我上面的quesion提出的意見:如果你有一個小數目固定的元素集合,可以代表組爲二進制口罩。所以說你有原始的字符串集:

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

創建一個可能的元素和位字典。位是兩個,其可以通過比特移位來創建職權: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) == 0ab沒有共同的元素;
(a & b) != 0b的至少一個元素在a;
a == b —套ab是相同的。

在集用語a & b是交叉點,a | b是工會和a^bab對稱差。

據我所知,jQuery是一個使用Javascript編寫的庫,所以所有按位運算符都應該可用。

相關問題