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

时间:2016-11-26 20:55:07

标签: javascript function recursion 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。

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

以下是我目前的代码:

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;

}

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

4 个答案:

答案 0 :(得分:5)

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

此提案不会破坏数组。

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

答案 1 :(得分:1)

将字符串拆分为数组,并检查第二个数组中的每个字符是否都在第一个数组中。

您可能想要随时拼接字符,以考虑相同字符的多个字符

&#13;
&#13;
function scramble(str1, str2) {
    var [arr1, arr2] = [str1.split(''), str2.split('')];
    return arr2.every(x=>arr1.indexOf(x)===-1?false:arr1.splice(arr1.indexOf(x),1));
}

console.log( scramble('rkqwodlw', 'world') );     // true
console.log( scramble('mgoaon', 'moon') );        // true
console.log( scramble('oijhnnassduda', 'moon') ); // false, only one "o"
console.log( scramble('test', 'unicorn') );       // false
&#13;
&#13;
&#13;

答案 2 :(得分:1)

以下是一些测试的功能:

&#13;
&#13;
function scramble(str1, str2) {
  var l = str2.length;
  for (var i = 0; i < l; i++) {
    if (str1.indexOf(str2[i]) > -1) {
      str1 = str1.replace(str2[i], '');
    } else {
      return false;
    }
  }
  return true;
}

function test(str1, str2) {
  console.log('testing "'+str1+'" w/ "'+str2+'": '+(scramble(str1, str2) ? 'true' : 'false'));
}

test('rkqodlw', 'world');
test('cedewaraaossoqqyt', 'codewars');
test('katas', 'steak');
&#13;
&#13;
&#13;

测试正在回归:

testing "rkqodlw" w/ "world": true
testing "cedewaraaossoqqyt" w/ "codewars": true
testing "katas" w/ "steak": false

该函数检查str2的每个char是否都在str1中,并将其从str1中删除,以便str1中的char不会计数两次。

答案 3 :(得分:0)

function scramble(str1, str2) {
var [a,b,c] = [str1.split(''),str2.split(''),[]];
for (let i = 0; i < b.length; i++) {
    if (a.indexOf(b[i]) !== -1) {c.push(b[i]), a.splice(a.indexOf(b[i]), 1);}
}
return b.join('') === c.join('');}