2016-11-16 2 views
1

J'ai besoin d'aide pour créer une plaque d'immatriculation (longueur de 6 caractères) à partir de chaînes de longueur égale ou inégale.Création de plaques d'immatriculation à partir de chaînes différentes mais similaires

Exemple 1:

$str1 = "YE37"; 
$str2 = "TE37"; 
$str3 = "LYTE"; 

Quand je Combine, il devrait me donner "LYTE37". Je dois tous les utiliser pour formuler une assiette. Je peux trouver la plus longue séquence commune entre $ str1 et $ str2 est "E37" mais pas sûr "Y" ou "T" vient en premier (ie, "YTE37" ou "TYE37") "alors je peux combiner avec $ str3 en utilisant le la plus longue séquence commune ("YTE") qui devait me donner "LYTE37"

Exemple 2:. "YLF3", "EYLF" et "YLF37" devrait me donner "EYLF37"

J'utilise ce qui suit. fonction qui trouve la plus longue séquence commune

$string_1="YE37"; 
$string_2="TE37"; 

$S =get_longest_common_subsequence($string_1, $string_2); // $S is "E37" 


function get_longest_common_subsequence($string_1, $string_2) 
    { 
    $string_1_length = strlen($string_1); 
    $string_2_length = strlen($string_2); 
    $return   = ''; 

    if ($string_1_length === 0 || $string_2_length === 0) 
    { 
    // No similarities 
    return $return; 
    } 

    $longest_common_subsequence = array(); 

    // Initialize the CSL array to assume there are no similarities 
    $longest_common_subsequence = array_fill(0, $string_1_length, array_fill(0, $string_2_length, 0)); 

    $largest_size = 0; 

    for ($i = 0; $i < $string_1_length; $i++) 
    { 
    for ($j = 0; $j < $string_2_length; $j++) 
    { 
    // Check every combination of characters 
    if ($string_1[$i] === $string_2[$j]) 
    { 
    // These are the same in both strings 
    if ($i === 0 || $j === 0) 
    { 
    // It's the first character, so it's clearly only 1 character long 
    $longest_common_subsequence[$i][$j] = 1; 
    } 
    else 
    { 
     // It's one character longer than the string from the previous character 
    $longest_common_subsequence[$i][$j] = $longest_common_subsequence[$i - 1][$j - 1] + 1; 
    } 

    if ($longest_common_subsequence[$i][$j] > $largest_size) 
    { 
    // Remember this as the largest 
    $largest_size = $longest_common_subsequence[$i][$j]; 
    // Wipe any previous results 
    $return  = ''; 
    // And then fall through to remember this new value 
    } 

    if ($longest_common_subsequence[$i][$j] === $largest_size) 
    { 
    // Remember the largest string(s) 
    $return = substr($string_1, $i - $largest_size + 1, $largest_size); 
    } 
    } 
    // Else, $CSL should be set to 0, which it was already initialized to 
    } 
    } 

    // Return the list of matches 
    return $return; 
    } 

je besoin d'un algorithme qui utilise ces chaînes et crée une plaque d'immatriculation.

Répondre

-1

Cela pourrait-il être l'algorithme que vous recherchez? Quick-Test Here.

<?php  
    $str1 = "YE37"; 
    $str2 = "TE37"; 
    $str3 = "LYTE"; 

    $strA = "YLF3"; 
    $strB = "EYLF"; 
    $strC = "YLF37"; 

    function generatePlateNumber($str1, $str2, $str3) { 
     $plateNumber = ''; 
     $arr   = array($str1, $str2, $str3); 
     $arrStr   = array(); 
     foreach($arr as $str){ 
      if(!preg_match("#\d#", $str)){ 
       $arrStr[] = $str; 
      } 
     } 
     foreach($arr as $str){ 
      if(preg_match("#\d#", $str)){ 
       $arrStr[] = $str; 
      } 
     } 
     $chars   = array_merge(str_split($arrStr[0]), 
             str_split($arrStr[1]), 
             str_split($arrStr[2])); 
     $alphabets  = []; 
     $numbers  = []; 
     foreach($chars as $char){ 
      if(is_numeric($char)){ 
       $numbers[]  = $char; 
      }else{ 
       $alphabets[] = $char; 
      } 
     } 
     $alphabets = array_unique($alphabets); 
     $numbers = array_unique($numbers); 

     // BUILD THE PLATE NUMBER: 
     $plateNumber .= implode($alphabets) . implode($numbers); 
     return $plateNumber; 
    } 
+0

@ Poiz, merci pour répondre. Cela fonctionne pour les deux exemples ci-dessus. Mais cela ne fonctionne pas bien pour "27RD", "E27", "AERD" car il montre "RDEA27" mais en fait la plaque est "AE27RD". Je pense que le mieux serait que nous analysions sa plus longue séquence commune et que nous la combinions en conséquence. –