计算两个字符串共享多少个唯一字符

问题描述:

我写了一个PHP函数,它以两个字符串作为参数$str1$str2计算两个字符串共享多少个唯一字符

现在我想要计算这两个字符串共享多少个唯一字符。例如:

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

在这个例子中,他们共享6个独特的字符,它们是:s,t,r,i,n,g

因此,这里是我当前的代码:

<?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

我会使用数组函数。爆炸 - array_unique - array_intersect - 计数 – Pevara

+0

1)缩进代码并使用空格使代码更具可读性2)现在,您会浏览第一个字符串的每个字符的整个第二个字符串。所以你比较's'(从string1)到'stringstring2'(string2),然后它会找到两个字符。为了解决这个问题,你想跟踪你已经使用过哪些字符。例如,你可以使用一个数组,并把所有字符串都包含在其中的所有唯一字符,如果字符已经在数组中,则在增加'$ cmp'之前检查。 – Rizier123

一个可能的解决方案是将字符存储在两个字符串共享的数组中,然后在增加$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你不需要写“感谢”评论。只是upvote /接受对你有帮助的答案。 – Rizier123

+0

我会使用'{}'作为你的答案中的第一个if语句来清楚地说明if语句中究竟是什么。 – Rizier123

接受的答案是好的,但是,如果要比较多个字符串并提取共性,这里是另一种解决方案:

$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