2016-11-26 102 views
1

我在遇到以下問題時遇到問題。我基本上必須編寫一個代碼/函數,如果str1的一部分可以重新編譯爲str2,則返回true。如何寫一個函數返回true,如果str1的一部分可以重新安排到str2?

編寫函數scramble(str1,str2),如果str1字符的一部分可以重新排列以匹配str2,則返回true,否則返回false。

例如: str1是'rkqodlw',而str2是'world',輸出應該返回true。 str1是'cedewaraaossoqqyt',而str2是'codewars'應該返回true。 str1是'katas',str2是'牛排'應該返回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; 

} 

能否請你幫我這個問題?

+2

我很困惑,是不是隻是彷彿'str2'所有的人物都在'str1'檢查一樣簡單,如果是這樣,則返回true? – adeneo

+1

此外,'if(str1 || str2 ===「undefined」){'沒有做你可能認爲它做的事 –

回答

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

1

這裏mulitiples是一些測試功能:

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賽車的每一個字符是str1和從STR1刪除它,以便從STR1一個字符不計兩次。

3

你可以使用一個散列表的字母數和檢查計數和減少計數。

此提議不會破壞數組。

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

+0

有點難以理解,但比其他解決方案更好的時間複雜性。 –

+0

沒錯,沒有indexOf,只是線性O. –

+0

讓我們測試一下 - > https://jsperf.com/scramble-thingy – adeneo

相關問題