2

我在下面的问题上遇到了麻烦。如果 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;

}

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

4

4 回答 4

6

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

这个提议不会改变数组。

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

于 2016-11-26T21:10:57.860 回答
1

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

你可能想在你去的时候拼接字符,以解释相同字符的多个

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

于 2016-11-26T21:05:05.823 回答
1

这是带有一些测试的功能:

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');

测试正在返回:

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

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

于 2016-11-26T21:05:28.070 回答
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('');}
于 2020-03-25T13:18:13.573 回答