2016-11-16 49 views
1

我需要帮助,以根据不同长度的字符串创建车牌(6个字符长度)。从不同但相似的字符串创建车牌

例1:

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

当我结合起来,它应该给我 “LYTE37”。我必须全部用它来制作一个盘子。我可以发现$ str1和$ str2之间的最长序列是“E37”,但不确定“Y”或“T”是否先出现(即“YTE37”还是“TYE37”)“,那么我可以与$ str3结合使用最长公共序列( “YTE”),这应该给我 “LYTE37”

例2: “YLF3”, “EYLF” 和 “YLF37” 应该给我 “EYLF37”

我用下面。功能查找最长公共序列

$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; 
    } 

我需要使用这些字符串,并创建一个车牌的算法。

回答

-1

请问这是你正在寻找的算法? 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,谢谢你的回答。它正在为上述两个例子工作。但对于“27RD”,“E27”,“AERD”来说,它不能很好地工作,因为它显示“RDEA27”,但实际上该板是“AE27RD”。我认为如果我们分析最长的共同序列并相应地组合,最好的办法是。 –