Dizilerde ilk bölümü eşleşen maskesi uzunluğunu bulun

2 Cevap php

Örneğin n değerleri olan bir dizi verilmiştir:

$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';

nasıl bu durumda ABCDEF olarak, değerler (feryat örnekte, veya çoğu) tüm maçları ilk segmenti bulabilirim?

EDIT 2: NOT Çözüldü, cevaba bakınız.

Daha da kötüsü, şu diziyi Verilen:

$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';
$arr[] = 'DEFABCABC';
$arr[] = 'DEFABCDEF';
$arr[] = 'DEFABCGHI';
$arr[] = 'DEFABCJKL';

nasıl alabilirim:

$result[] = 'ABCDEF';
$result[] = 'DEFABC';

Bu bir Ne Ben başarmak için çalışıyorum strspn () ("maske" sırası önemli değil, nerede size Zed teşekkür) diziler uygulamalı davranış ... zordur.

EDIT: To clarify things up a bit what I want is to find the all the common letters that exist in the same index in all the values of the array (not sure if this made it easier or not!). In this second problem, since all chars don't match the index in the other values I need to match the maximum number of identical initial segments (in this case 2: ABCDEF and DEFABC).

2 Cevap

Eğer doğru anlamak, dizeleri bir dizi verilen en uzun önek kümesini belirlemek için çalışıyoruz.

Aşağı kırılma, herhangi iki dizeleri arasındaki paylaşılan önek olarak bulunabilir

function longestCommonPrefix($str1, $str2) {
  $minLen = min(strlen($str1), strlen($str2));
  for ($i = 0; $i < $minLen; $i++) {
      if ($str1[$i] != $str2[$i]) {
          return substr($str1, 0, $i);
      }
  }
  return substr($str1, 0, $minLen);
}

Önekler kümesini almak için bir yolu daha sonra olabilir:

function longestCommonPrefixes($arr) {
  sort($arr);
  $prefixes = array();
  for ($i = 0; $i < count($arr); $i++) {
      for ($j = $i+1; $j < count($arr); $j++) {
          $prefix = longestCommonPrefix($arr[$i], $arr[$j]);
          if ($prefix == "") break;
          $prefixes[$prefix] = true;
      }
  }
  return array_keys($prefixes);
}

Döndürülen önekleri birbirinden önekleri olabilir edin. İşte sonuç böyle array('A', 'AA', 'AAA') gibi dizeleri bir dizi içeren için, bu mümkün değildir.

Hepsini bir araya getirirsek:

$arr = array();
$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';
$arr[] = 'DEFABCABC';
$arr[] = 'DEFABCDEF';
$arr[] = 'DEFABCGHI';
$arr[] = 'DEFABCJKL';

print_r(longestCommonPrefixes($arr));

verimleri

Array
(
    [0] => ABCDEF
    [1] => DEFABC
)

Benim ilk sorun için bir çözüm ile geldim:

EDIT: BUGGY!

$arr = array();

// Bug: ABCDEFX

$arr[] = 'ABCDEFAXC';
$arr[] = 'ABCDEFDXF';
$arr[] = 'ABCDEFGXI';
$arr[] = 'ABCDEFJXL';

/*
$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';
*/

// ABCDEF    
$result = implode('', call_user_func_array('array_intersect_assoc', array_map('str_split', $arr)));

Bir anda gitmek için sol ...