2016-02-24 20 views
30

は、私は、次の2つの文字列を持っている:シャッフルされた2つの文字列を比較するにはどうすればよいですか?

var str1 = "hello"; 
var str2 = "ehlol"; 

は、どのように私は両方の文字列が同じ文字を含めるかどうかを確認することができますか?

+5

は、「こんにちは」と「EHLO」の両方が同じ4つの文字から構成されていることを考えると、試合としてカウントしませんか? – nnnnnn

+0

「同じアルファベットを共有する」があいまいであることを明確にしていないか、明確に指定していないかを明確にしないでください –

+0

パフォーマンスが問題の場合は、 – Cristy

答えて

37

非常に最適ではないかもしれませんが、あなたは、単に1件のコメント内の別の提案のアプローチ(ケース、文字列の長さの最適化のためにはかなり大きいです)

str1.split("").sort().join() == str2.split("").sort().join(); //outputs true 

を行うことができます

を使用でき
str1.length===str2.length && str1.split("").sort().join() == str2.split("").sort().join(); //first check the length to quickly rule out in case of obvious non-matches 
+0

@ gurvinder372は、同じ文字が個別にカウンターになるのでしょうか? – guradio

+3

@guradioそれらは個別に数えられるでしょう – gurvinder372

+4

最初に長さをチェックすることによってそれを最適化することができます: 'str1.length === str2.length && str1.split(" ")。sort()。join()== str2.split ").sort()。join()';長いですが、簡単なケースでリソースを節約します – Martijn

3

sameCharsここのようなこの目的のための関数 -

function myFunction() 
 
{ 
 
    var input_1 = document.getElementById('input_1').value; 
 
    var input_2 = document.getElementById('input_2').value; 
 
    var result = sameChars(input_1,input_2); 
 
    document.getElementById("demo").innerHTML = result; 
 
} 
 

 
function sameChars(firstStr, secondStr) 
 
{ 
 
    var first = firstStr.split('').sort().join(''); 
 
    var second = secondStr.split('').sort().join(''); 
 
    return first.localeCompare(second)==0; 
 
}
<input type="text" maxlength="512" id="input_1"/> 
 
<input type="text" maxlength="512" id="input_2"/> 
 
<button onclick="myFunction()">Check If Shuffled</button> 
 
<p id="demo"></p>

+0

タグはJavaScriptであり、Javaではありません:) – gurvinder372

+0

申し訳ありません、それを変換する瞬間を与えてください:( –

+0

これはまだJavaです:)あなたのブラウザのコンソールで試してみて – gurvinder372

4

推奨する方法の1つは、ハッシュテーブルを使用することです。各文字が何回表示されるかをカウントします。文字がASCIIの場合、これが最も効果的です。

このアルゴリズムの複雑さはMNは、文字列の長さであり、sigmaは異なる文字の数であるO(M+N+sigma)あります。受け入れられる解の複雑さはソートのために高くなります。ソートは通常O(N*logN)で行われますが、文字列が短い場合は依然として良好です。あなたの弦に数十万の文字があるなら、これは行く方法です。 hash tablesを使用することの欠点は、並べ替えを使用するソリューションよりもmemoryの使用率が高いことです。

function sameLetters(str1, str2){ 
    var hash = {}; 

    var len1 = str1.length; 
    var len2 = str2.length; 

    // Strings with different lengths can't contain the same letters 
    if(len1 !== len2) return false; 

    // Count how many times each character appears in str1 
    for(var i = 0; i < len1; ++i) { 
    var c = str1[i]; 
    if(typeof hash[c] !== 'undefined') hash[c]++; 
    else hash[c] = 1; 
    } 

    // Make sure each character appearing in str2 was found in str1 
    for(var i = 0; i < len2; ++i) { 
    var c = str2[i]; 
    if(typeof hash[c] === 'undefined') return false; 
    if(hash[c] === 0) return false; 
    hash[c]--; 
    } 

    // Make sure no letters are left 
    for(var c in hash) { 
    if(hash[c]) return false; 
    }  

    return true; 
} 

あなたはその後、(ブラウザのコンソールにそれで遊ぶ)このような関数を呼び出すことができます。

sameLetters("hello", "ehlol"); // true 
sameLetters("hello", "ehllol"); // false 
1

はここGurvinders answerの修正版です。

var str1 = "hello", 
    str2 = "ehlol"; 

// Add sort on prototype of String object 
String.prototype.sort = function() { 
    return this.split('').sort().join(''); 
}; 

// First check if length of both is same 
var same = str1.length === str2.length && str1.sort() === str2.sort(); 
console.log('Strings are same?', same); 
0

あなたはおそらくこれを言うことができます:

(a.length === b.length) && (a.split('').every(function(val) { return b.indexOf(val) > -1})) 

そして、ES6であなたは次のようにそれが見えるようにすることができます:

(a.length === b.length) && a.split('').every(val => { return b.indexOf(val) > -1 }) 
0

あなたは、単純なforeachのループを使用することにより確認することができます。ループ(Stringの配列)を繰り返し、最初のStringの配列内の2番目のStringの各要素をチェックします。

var str1 = "hello"; 
 
var str2 = "ehlol"; 
 
var array1 = str1 .split("") ; 
 
var array2= str2 .split(""); 
 
var isMatched = true; 
 
if(array1.length == array2.length){ 
 
array2.forEach(function(elem , i){ 
 
    if(array1.indexOf(elem) <0){ 
 
    isMatched = false; 
 
    return false; 
 
    } 
 
}) 
 
} 
 
if(!isMatched){ 
 
console.log("Not Matched"); 
 
}else{ 
 
console.log("Matched"); 
 
}

関連する問題