我目前正在尝试完成代码挑战以获得乐趣。这是场景。
如果function scramble(str1,str2)
个字符的一部分可以重新排列以匹配true
,则写str1
,返回str2
,否则返回false
。
例如:
str1
为'rkqodlw'
,str2
为'world'
,输出应返回true
。
str1
为'cedewaraaossoqqyt'
而str2
为'codewars'
应返回true
。
str1
为'katas'
而str2
为'steak'
应返回false
。
我写的函数有效,但需要很长时间才能执行所有可能的测试。如何让我的功能更高效?提前谢谢。
这是我写的函数:
function scramble(str1, str2) {
for (var i = 0; i < str1.length; i++) {
str2 = str2.replace(str1.charAt(i),'');
}
return str2.length == 0 ? true : false;
}
答案 0 :(得分:1)
我现在要尝试编写代码,但也许不同的approch可以给出有趣的结果。 基本上我的想法是:
以下是代码:
let lettersCounter = new Object();
for (let i = 0; i < str2.length; i++) {
if (typeof lettersCounter[str2[i]] !== 'undefined'){
lettersCounter[str2[i]] ++;
} else {
lettersCounter[str2[i]] = 1;
}
}
let props = Object.keys(lettersCounter);
for (let i = 0; i < props.length; i ++){
let currLetter = props[i];
if ((str1.split(currLetter).length) <= lettersCounter[currLetter] ){
return false;
}
}
return true;
我认为这里真正的弱点是str1.split - 使用正则表达式可能会更快 - 但我讨厌写正则表达式,所以我要把它留给你:)
哦,正如一些人在评论中写的那样,你应该做一些初始化检查,比如str1 === str2和str2.length&lt; = str1.length