2016-11-26 4 views
1

私は以下の質問に問題があります。私は基本的に、str1の一部がstr2に再配置できる場合にtrueを返すコード/関数を記述する必要があります。str1の一部をstr2に再配置できる場合にtrueを返す関数の記述方法は?

str1文字の一部をstr2と一致するように並べ替えることができる場合はtrueを返し、そうでない場合はfalseを返す書き込み関数scramble(str1、str2)。

例: 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; 

} 

あなたはこの質問で私を助けていただけますか?

+2

私は混乱しているstr2' 'のすべての文字がstr1''であり、そうであれば、trueを返す場合、それだけでチェックするような単純なものではないでしょうか? – adeneo

+1

また、 'if(str1 || str2 ===" undefined "){'はおそらくあなたがしていると思っていることをしていません –

答えて

1

文字列を配列に分割し、2番目の配列のすべての文字が最初の配列の内側にあるかどうかを確認します。あなたはおそらく、あなたが行くように同じ文字ここ

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のすべてのcharがSTR1にあり、STR1からcharが二度カウントされませんように、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 ofだけでなく、線形のO. –

+0

をテストしてみましょう。 - > https://jsperf.com/scramble-thingy – adeneo

関連する問題