代码之家  ›  专栏  ›  技术社区  ›  Tom

如何在PHP中找到两个字符串之间最大的公共子字符串?

  •  18
  • Tom  · 技术社区  · 16 年前

    有没有一种快速算法可以在两个字符串中找到最大的公共子字符串 strings 或者这是一个完全的问题?

    在PHP中,我可以大海捞针:

    <?php
    
    if (strstr("there is a needle in a haystack", "needle")) {
        echo "found<br>\n";
    }
    ?>
    

    但那将是非常昂贵的!特别是因为我的应用程序是搜索电子邮件数据库并查找垃圾邮件(即同一个人发送的类似电子邮件)。

    有没有人可以把PHP代码扔出去?

    6 回复  |  直到 8 年前
        1
  •  10
  •   Zoredache    16 年前

    这个 similar_text

    这将计算两个字符串之间的相似性。返回两个字符串中匹配的字符数

    你可能还想看看 levenshtein

        3
  •  5
  •   Ben    8 年前

    我刚刚编写了一个函数,用于查找str1中存在于str2中的最长子字符串

    public static function getLongestMatchingSubstring($str1, $str2)
    {
        $len_1 = strlen($str1);
        $longest = '';
        for($i = 0; $i < $len_1; $i++){
            for($j = $len_1 - $i; $j > 0; $j--){
                $sub = substr($str1, $i, $j);
                if (strpos($str2, $sub) !== false && strlen($sub) > strlen($longest)){
                    $longest = $sub;
                    break;
                }
            }
        }
        return $longest;
    }
    
        4
  •  4
  •   Manoj Sharma    7 年前

    例子:

    $array = array(
        'PTT757LP4',
        'PTT757A',
        'PCT757B',
        'PCT757LP4EV'
    );
    echo longest_common_substring($array); // => T757
    

    职能:

    function longest_common_substring($words) {
        $words = array_map('strtolower', array_map('trim', $words));
        $sort_by_strlen = create_function('$a, $b', 'if (strlen($a) == strlen($b)) { return strcmp($a, $b); } return (strlen($a) < strlen($b)) ? -1 : 1;');
        usort($words, $sort_by_strlen);
        // We have to assume that each string has something in common with the first
        // string (post sort), we just need to figure out what the longest common
        // string is. If any string DOES NOT have something in common with the first
        // string, return false.
        $longest_common_substring = array();
        $shortest_string = str_split(array_shift($words));
    
        while (sizeof($shortest_string)) {
            array_unshift($longest_common_substring, '');
            foreach ($shortest_string as $ci => $char) {
                foreach ($words as $wi => $word) {
                    if (!strstr($word, $longest_common_substring[0] . $char)) {
                        // No match
                        break 2;
                    } // if
                } // foreach
                // we found the current char in each word, so add it to the first longest_common_substring element,
                // then start checking again using the next char as well
                $longest_common_substring[0].= $char;
            } // foreach
            // We've finished looping through the entire shortest_string.
            // Remove the first char and start all over. Do this until there are no more
            // chars to search on.
            array_shift($shortest_string);
        }
        // If we made it here then we've run through everything
        usort($longest_common_substring, $sort_by_strlen);
        return array_pop($longest_common_substring);
    }
    

    我在我的博客上写了一点:

        5
  •  3
  •   Tanj    15 年前

    后来我发现 a relevant wikipedia article

    在PHP中,我找到了 similar_text 注意:类似这样的东西是不可伸缩的 :

    <?php
    // Gather all messages by a user into two identical associative arrays
    $getMsgsRes = mysql_query(SELECT * FROM email_messages WHERE from = '$someUserID');
    while($msgInfo = mysql_fetch_assoc($getMsgsRes))
    {
        $msgsInfo1[] = $msgInfo;
        $msgsInfo2[] = $msgInfo;
    }
    
    // Loop over msgs and compare each one to every other
    foreach ($msgsInfo1 as $msg1)
        foreach ($msgsInfo2 as $msg2)
            similar_text($msg1['msgTxt'],$msg2['msgTxt'],$similarity_pst);
            if ($similarity_pst > 90)
                echo "{$msg1['msgID']} is ${similarity_pst}% to {$msg2['msgID']}\n";
    ?>
    
        6
  •  1
  •   Stefan Gehrig    16 年前

    请看一看 Algorithm implementation/Strings/Longest common substring 在维基百科上。我还没有测试PHP实现,但它似乎与Wikipedia页面上的通用算法相匹配。