我有以下代码可以工作。但是使用正则表达式会是更有效的代码吗?
(如果数组的第一个元素中的字符串包含数组第二个元素中字符串的字母,则返回 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']);
使用正则表达式执行此检查,如上面显示的代码:
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
用于执行正则表达式
在 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
可以和字典一起使用,只收集字母,但对于许多可能的字母(Unicode 字符串)来说,它会更慢。
如果你不必关心内存使用情况,你可以使用 .charCodeAt
创建密集数组来索引数组中的元素,以便 O(1) 访问以检查元素是否存在 ( O(m+n+k)
)。