我有以下代码可行。但是使用RegExp会更有效吗?
(如果数组的第一个元素中的字符串包含数组第二个元素中字符串的字母,则返回true。)
function mutation(arr) {
var first = arr[0].split("");
var second = arr[1].split("");
var answer = false;
for (var e = 0; e < second.length; e++) {
answer = false;
for (var i = 0; i < first.length; i++) {
if (first[i] === second[e]) {
answer = true;
}
}
}
return answer;
}
mutation(['hello', 'hey']);
答案 0 :(得分:0)
使用正则表达式检查上面显示的代码:
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
以获取正则表达式new RegExp
test
用于构造正则表达式对象答案 1 :(得分:0)
在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;
}
此解决方案为O(m+n+k)
,其中m
和n
是字符串中的字母数,k
是使用过的字母数。
您的解决方案是O(m*n)
,效率非常低。
在ES5 Object
中可以使用.charCodeAt
以及仅收集字母的字典,但对于许多可能的字母(Unicode字符串)来说它会更慢。
如果您不必关心内存使用情况,可以使用O(m+n+k)
创建密集数组来索引数组中的元素,以便O(1)访问以检查元素是否存在({{1}})。