查找字符串中单词的字符,优化

乔·比恩

我正在做一些代码挑战,希望学习一些新知识。目前,我已经编写了一段代码,以一串随机字母查找给定单词的字符。

我认为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达到正确的结果,并且自己循环执行,加上哈希表也实现了这一点。

妮娜·斯科茨(Nina Scholz)

您可以获取一个哈希表,计算所需的字符,如果不需要计数则返回。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章