如果可以将一部分str1重新安排为str2,如何编写返回true的函数?

Tae*_*Tae 2 javascript recursion function scramble

我遇到以下问题。我基本上必须编写一个代码/函数,如果可以将str1的一部分重新填充到str2,则返回true。

编写函数scramble(str1,str2),如果可以重新排列部分str1字符以匹配str2,则返回true,否则返回false。

例如:str1是'rkqodlw',而str2是'world',输出应返回true。str1是'cedewaraaossoqqyt',而str2是'codewars'应该返回true。str1是'katas',而str2是'steak'应该返回false。

仅使用小写字母(az)。不包含标点符号或数字。性能需要考虑。

下面是我目前的代码:

function scramble(str1, str2) {
  var first; //longer string
  var second; //shorter string

  if(str1 || str2 === "undefined") {
    return false;
  }

  if(str1.length > str2.length) {
    first = str1;
    second = str2
  } else if(str2.length > str1.length) {
    first = str2;
    second = str1;
  }

  for (i=0; i<second.length; i++) {
    if (first.indexOf(second[i]) === -1) {
      return false;
    }
  }

  return true;

}
Run Code Online (Sandbox Code Playgroud)

您能帮我解决这个问题吗?

Nin*_*olz 5

您可以使用带有字母计数的哈希表,并使用count检查并减少count。

该建议不会破坏阵列。

function scramble(str1, str2) {
    var count = Object.create(null);

    Array.prototype.forEach.call(str1, function(a) {
        count[a] = (count[a] || 0) + 1;
    });

    return Array.prototype.every.call(str2, function(a) {
        return count[a]--;
    });
}

console.log(scramble('rkqodlw', 'world'));              // true
console.log(scramble('cedewaraaossoqqyt', 'codewars')); // true
console.log(scramble('katas', 'steak'));                // false
console.log(scramble('', 'o'));                // false
Run Code Online (Sandbox Code Playgroud)