2017-04-25 90 views
0

正如標題所示,我需要獲得2個字符串之間最長的公共子字符串。問題是我還需要打印所有的共同部分,如果有多個。例如:打印2個字符串之間的所有公共部分

$字符串1 = 「asbafbae MATCH1 asjdndrey MATCH2」;

$字符串2 = 「12412342gt MATCH1 hgm1g5m MATCH2」;

最少報名輸出:MATCH1,MATCH2

這是我使用的代碼,我設法獲得最長的公共子,但只有一個。

<?php 
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; 
} 

$string1 = 'asbafbaeMATCH1asjdndreyMATCH2'; 
$string2 = '12412342gtMATCH1hgm1g5mMATCH2'; 
echo getLongestMatchingSubstring($string1, $string2); 
?> 

有了,我得到MATCH1作爲輸出。也許我正在編寫的代碼專門用來獲取最長的代碼。希望有人能幫助我

+0

保留一個匹配數組。當你找到一個匹配時,檢查它是否與數組元素長度相同或更長。如果時間更長,請清空陣列並添加新的匹配項。如果長度相同,只需添加新的匹配。 – Barmar

回答

0

我修改你的函數來獲得最長的比賽在陣列

<?php 
function getLongestMatchingSubstring($str1, $str2) 
{ 
    $len_1 = strlen($str1); 
    $longest = array(); 
    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) > 1){ 
       $longest[] = $sub; 
       $i = strpos($str1, $sub) + (strlen($sub)-1); 
       break; 
      } 
     } 
    } 
    return $longest; 
} 

$string1 = 'asbaMbaeMATCH1asjdndreyMATCH22r5g7jdg3MATCH33'; 
$string2 = '1241M342gtMAThgMATCH1m1g5mMATCH2cghdiMATCH33'; 
print_r(getLongestMatchingSubstring($string1, $string2)); 

輸出將

陣列([0] => M [1] => MATCH1 [2 ] => MATCH2 [3] => MATCH33)

+0

非常感謝。有用。但不知何故,只有當你在字符串變量中以相同的順序放置匹配的單詞時才起作用,否則它只顯示一個匹配的單詞。例如:如果$ str1 =「123Example」和「$ str2 = Example123」,它只顯示「123」作爲常用單詞。我需要以不同的方式編碼嗎?無論如何非常感謝你,我更接近我需要的東西。 – josephbc

+0

對不起,計算應爲$ str1的$ i偏移量時出錯,我修改了代碼,以便修復該問題並更改條件,使其不會顯示單個字符匹配。 –

相關問題