Php 计算两个字符串之间共享的唯一字符数

Php 计算两个字符串之间共享的唯一字符数,php,string,function,Php,String,Function,我编写了一个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 < strle

我编写了一个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?

一个可能的解决方案是将字符存储在两个字符串共享的数组中,然后在递增
$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"); 函数比较($str1,$str2){ $cmp=0; $used_letter=array(); 对于($i=0;$i; } 比较(“String1”、“String2”);
接受的答案是好的,但是,如果您想要比较多个字符串并提取公共字符,下面是另一个解决方案:

$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"]

您可以使用hastable。您现在的复杂度是O(n**2),通过哈希表,您可以将其放在O(n)中。使用哈希表。我将使用数组函数。Explode-array\u unique-array\u intersect-count1)缩进代码并使用空格使代码更具可读性2)现在,您要为第一个字符串的每个字符遍历整个第二个字符串。因此,您将
s
(从string1)与
string2
(string2)进行比较,然后它将找到该字符两次。要解决此问题,您需要跟踪已使用的字符。例如,您可以使用一个数组,将两个字符串中的所有唯一字符放入其中,并在递增
$cmp
之前检查该字符是否已在数组中。非常感谢@VaibhavBhanushali@novex你不需要写“谢谢”的评论。我会用
{}
作为你答案中的第一个if语句,以明确if语句的确切内容。似乎我漏掉了:(@Rizier123@Rizier123这只是我第一次问问题,我不知道这些规则。我感谢你的帮助@cpugourou:D