2016-06-11 11 views
2

パラメータとして2つの文字列を受け取るPHP関数$str1$str2を書きました。2つの文字列が互いに共有する一意の文字の数を数えます。

ここでは、2つの文字列が共有する一意の文字の数を数えたいと思います。例えばだから:s,t,r,i,n,g:この例では

$str1 = "stringstring1"; 
$str2 = "stringstring2"; 

彼らは6人のユニークなキャラクターを、共有しています。

<?php 

    function compare($str1, $str2){ 
     $cmp = 0; 

     for($i = 0; $i < strlen($str1); $i++){ 

      for($j = 0; $j < strlen($str2); $j++){ 
       if($str1[$i] == $str2[$j]) 
        $cmp++; 
      } 

     } 

     echo "Number of characters in common: ".$cmp."<br />"; 
    } 

    compare("stringstring1", "stringstring2"); 

?> 

問題は、それが代わりに24を出力していること、それが私の代わりに6の出力24を与え、私が間違っていたところ、私は見ていないということです今:だからここ

は私の現在のコードです6の?

+0

ますhastableを使用することができます。あなたの複雑さは今O(n ** 2)であり、O(n)でそれを持つことができるハッシュテーブルです。ハッシュテーブルを使用します。 – DarthVader

+0

私は配列関数を使います。 Explode - array_unique - array_intersect - count – Pevara

+0

1)コードをインデントし、スペースを使用してコードを読みやすくします。2)今すぐ最初の文字列の各文字の2番目の文字列全体を調べます。だから 's'(string1から)と' stringstring2'(string2)を比較すると、文字が2回見つかるはずです。これを解決するには、すでに使用している文字を把握する必要があります。たとえば、配列を使用して、両方の文字列にあるすべての一意の文字を入れ、文字が配列内にある場合は、 '$ cmp'をインクリメントする前にチェックすることができます。 – Rizier123

答えて

0

可能な解決策は、両方の文字列が共有している配列に文字を格納し、インクリメントする前に文字を数えているかどうかを確認することです。$cmpここで

が書き換えコードは次のとおりです。

function compare($str1, $str2){ 
    $cmp = 0; 
    $used_letter = array(); 

    for($i = 0; $i < strlen($str1); $i++){ 

     for($j = 0; $j < strlen($str2); $j++){ 
      if($str1[$i] == $str2[$j]) 
       if(!in_array($str1[$i], $used_letter)){ 
        $cmp++; 
        $used_letter[$cmp] = $str1[$i]; 
       } 
     } 
    } 

    echo "Number of characters in common: " . $cmp . "<br />"; 

} 

compare("stringstring1","stringstring2"); 
+1

大変ありがとう@Vaibhav Bhanushali – novex

+0

@novex「感謝」のコメントを書く必要はありません。あなたに役立つ答えをアップアップ/受け入れてください。 – Rizier123

+0

答えの最初のif文に '{}'を使用して、if文の正確な内容を明確にします。 – Rizier123

0

受け入れ答えは良いですが、あなたが複数の文字列を比較し、共通の文字を抽出したい場合は、しかし、ここでもう一つの解決策は次のとおりです。

$str1 = "stringstring1"; 
$str2 = "stringstring2"; 
$str3 = "stringstring3"; 
$computed = array_merge_recursive(array_count_values(str_split($str1)), array_count_values(str_split($str2)), array_count_values(str_split($str3))); 
$commons = array(); 
foreach ($computed as $key => $el) { 
    if (is_array($el)) 
     $commons[] = $key; 
} 

/*commons*/ 
["s", "t", "r", "i", "n", "g"] 
+0

私はあなたの助けを感謝します@cpugourou:D – novex