我正在做一些代码挑战,希望学习一些新知识。目前,我已经编写了一段代码,以一串随机字母查找给定单词的字符。
我认为regexp可能是最佳的性能选择(这是目标之一)。这段代码通过了检查,但是对于荒谬的长字符串来说却花费了太长时间。有什么办法可以改善吗?老实说这真的很丑。我尝试了几种方法,但我可能真的只是reg exp等领域的新手。
在所有if语句之前,我仅使用regexp,但如果str2(这是我要查找的单词)具有双字符,它将返回“ true”,因为它将计算已计数的字符。这就是为什么我使用replace来排除它们。那就是我所能得到的。
目标是如果可以重新排列str1的一部分以形成str2,则返回true,否则返回false。仅使用小写字母(az)。不包含标点符号或数字。例如scramble('aabbcamaomsccdd','逗号')应该返回true
function scramble (str1, str2)
{
var o = 0; // tracks amount of matched letters.
for(i = 0; i < str2.length; i++)
{
var regex1 = new RegExp (str2[i]) ; // select letter from word that needs to be found
if( regex1.test(str1) == true)// if selected character is found us replace to remove it from the random characters string for next iteration.
{
str1 = str1.replace(regex1 ,"");
o++; // increment o if character is removed from random string.
}
}
//check if amount of removed characters equals total characters of word that we want.
if ( o == str2.length)
{
return true
}
if (o !== str2.length)
{
return false
}
}
更新:我将哈希表标记为答案,因为afaik这对于regexp来说是行不通的,看来我也可以使用.split达到正确的结果,并且自己循环执行,加上哈希表也实现了这一点。
您可以获取一个哈希表,计算所需的字符,如果不需要计数则返回。
function scramble (str1, str2) {
var counter = {},
keys = 0;
for (let i = 0; i < str2.length; i++) {
if (!counter[str2[i]]) {
counter[str2[i]] = 0;
keys++;
}
counter[str2[i]]++;
}
for (let i = 0; i < str1.length; i++) {
if (!counter[str1[i]]) continue;
if (!--counter[str1[i]] && !--keys) return true;
}
return false;
}
console.log(scramble('abc', 'cba'));
console.log(scramble('abc', 'aba'));
console.log(scramble('abcdea', 'aba'));
console.log(scramble('aabbcamaomsccdd', 'commas'));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句