使用RegExp在数组中循环而不是for循环(Javascript)
我有下面的代码工作。但是使用RegExp会是一种更有效的代码吗 (如果数组第一个元素中的字符串包含数组第二个元素中字符串的字母,则返回true。)使用RegExp在数组中循环而不是for循环(Javascript),javascript,arrays,regex,Javascript,Arrays,Regex,我有下面的代码工作。但是使用RegExp会是一种更有效的代码吗 (如果数组第一个元素中的字符串包含数组第二个元素中字符串的字母,则返回true。) 功能突变(arr){ var first=arr[0]。拆分(“”); var second=arr[1]。拆分(“”); var-answer=false; 对于(var e=0;e
功能突变(arr){
var first=arr[0]。拆分(“”);
var second=arr[1]。拆分(“”);
var-answer=false;
对于(var e=0;e
使用正则表达式执行此检查,如上面显示的代码所示:
var a = 'hello how are you';
var b ='hey you there';
var result = new RegExp(b.split(/ +/)[0].split('').join('|')).test( a.split(/ +/)[0] );
//=> true
- 第一个
用于从两个字符串中获取第一个单词split(+/)[0]
- 然后使用
从第二次输入的第一个单词中获取每个字母split(“”)
用于通过join(“|”)
将它们连接起来,以使正则表达式成为|
h|e|y
用于构造regex对象newregexp
用于执行正则表达式test
function mutation(lettersSource, checkedString) {
var referenceLetters = new Set(lettersSource); // get letters from string
var usedLetters = new Set(checkedString);
// create union of letters in both strings
var lettersUnion = new Set([...usedLetters, ...referenceLetters]);
return lettersUnion.size === referenceLetters.size;
}
这个解决方案是O(m+n+k)
,其中m
和n
是字符串中的字母数,k
是使用的字母数
您的解决方案是O(m*n)
,效率很低
在ES5中,Object可以与dictionary一起用于仅收集字母,但对于许多可能的字母(Unicode字符串),它的速度会较慢
如果您不必关心内存使用情况,您可以使用
.charCodeAt
创建密集数组来索引数组中的元素,以便O(1)访问检查元素是否存在(O(m+n+k)
)。代码中唯一重要的匹配是第二个字符串的最后一个字符,因为你在每个字母前都将answer
设置回false
。正则表达式肯定会更优雅,我不确定效率,尽管你可以使用ES6集合吗?@非常感谢你指出这一点。我想我必须解决这个问题。谢谢你的解释。它看起来比双圈的要优雅得多。
function mutation(lettersSource, checkedString) {
var referenceLetters = new Set(lettersSource); // get letters from string
var usedLetters = new Set(checkedString);
// create union of letters in both strings
var lettersUnion = new Set([...usedLetters, ...referenceLetters]);
return lettersUnion.size === referenceLetters.size;
}