我遇到以下问题。我基本上必须编写一个代码/函数,如果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;
}
你能帮我解决这个问题吗?
答案 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)
将字符串拆分为数组,并检查第二个数组中的每个字符是否都在第一个数组中。
您可能想要随时拼接字符,以考虑相同字符的多个字符
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;
答案 2 :(得分: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');
&#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('');}