2013-06-23 1 views
1

나는 여기 내가 원하는 것을 가까이 갔다. 나는 그들이 말한 결과와 같거나 그 반대이면 결과를 표시하지 않는 논리 문제를 겪었다. 두 개의 다른 주 이름의 아나그램 인 두 개의 미국 주 이름의 아나그램을 찾고 있습니다. 솔루션을 찾았습니다. 이제는 디스플레이 문제 일뿐입니다. 나는 생각합니다. 어떤 도움이라도 대단히 감사하겠습니다. 고맙습니다.anagram 결과와 같거나 그 반대 인 문자열을 제거하는 방법은 무엇입니까?

<?php 
ini_set('max_execution_time', 300); 
function anagramOf ($array, $start, $len) 
{ 
    global $i; 
    $word = implode ("", $array); 
    $i = ++$i; 
    printf ("%'.-20d%'.20s%s", $i, ucfirst($word), "<BR> \n"); 
} 

function sortstr ($astring) 
{ 
    global $word, $s, $l; 
    $s = strtolower ($astring); 
    $array = preg_split ('//', $s, -1, PREG_SPLIT_NO_EMPTY); 
    sort ($array); 
    $s = implode ("", $array); 
} 

function search ($aword,$pairs) 
{ 
    global $len, $word, $s, $i; 

    $size = count ($pairs); 
    for ($k = 0; $k < $size; $k++) 
    { 
    $pairs[$k] = chop ($pairs[$k]); 
     if (strlen ($pairs[$k]) == $len) 
     { 
      $l = $pairs[$k]; 
      sortstr ($l); 
      $ls = $s; 

      if (!strcmp ($ls, $word)) 
      { 
      $i = ++$i;     
      printf ("%'.-20d%'.20s%s", $i, ucfirst ($l), "</br</br>"); 
      }      
     } 
    } 
} 


$states1 = array("Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","New Hampshire","New Jersey","New Mexico","New York","North Carolina","North Dakota","Ohio","Oklahoma","Oregon","Pennsylvania","Rhode Island","South Carolina","South Dakota","Tennessee","Texas","Utah","Vermont","Virginia","Washington","West Virginia","Wisconsin","Wyoming"); 

$states2 = array(); 
$states2 = $states1; 

$pairs = array(); 
$countS1 = count($states1); 
$countS2 = count($states2); 
$countPr; 

$i=0; 
foreach($states1 as $s1array) 
{ 
    $j=0; 
    foreach($states2 as $s2array) 
    {  
     $pairs[]=array($s1array => $s2array); 
     $j++; 
    } 
    $i++; 
} 

$pCountPair = count($pairs);  
$newpairs = array(); 
$l=0; 
foreach($pairs as $p => $pairs2) 
{ 
    foreach($pairs2 as $name1 => $name2) 
    { 
     $newpairs[]=$name1.$name2;; 
    } 
    $l++; 
} 

$p2count = count($newpairs); 
#echo 'p2 = '.$p2count.'</br>'; 

for($r = 0; $r < $p2count; $r++) 
{ 
    $word = $newpairs[$r]; 
    echo "Anagrams of <b>".ucfirst ($word)."</b> :\n<BR>\n"; 
    $na = $word; 

    sortstr ($word); 
    $word = $s; 
    $len = strlen ($word); 
    $i = 0; 
    search ($word,$newpairs); 

} 
if ($i == 0) 

    echo "Can't find any anagram of <B>".ucfirst($na)."</B> in the pairs array.</br></br>";    
?> 

답변

1

그래서 가장 큰 문제는 당신이 함께 상태를 결합하는 방법입니다. AlabamaAlaska와 AlaskaAlabama가 일치하는 상태 목록에 있습니다. 그러므로 할 일은 고유 한 두 가지 상태 조합 만 일치시키는 것입니다.

$doubleStates = array(); 

for ($i = 0, $max = count($states); $i < $max; $i++) { 
    // The first loop starts from the first element of the array 
    for ($j = $i + 1; $j < $max; $j++) { 
     // The second loop starts from the next element of the first loop 
     $doubleStates[] = $states[$i] . $states[$j]; 
    } 
} 

는 아마 당신을 위해 모든 코드를 작성하지 않아야하지만 흥분있어 : 이것은 좋은, 감사를 정리

<?php 

function findAnagrams($array) { 
    do { 
     $matcher = null; 
     $matches = array(); 
     foreach ($array as $key => $val) { 
      if (is_null($matcher)) { 
       unset($array[$key]); 
       $matcher = $val; 
      } elseif (isAnagram($matcher, $val)) { 
       if (empty($matches)) { 
        $matches[] = $matcher; 
       } 
       $matches[] = $val; 
      } 
     } 

     if (count($matches) > 0) { 
      print_r($matches); 
      echo "<br >"; 
     } 
    } while (count($array) > 0); 
} 

function isAnagram($a, $b) { 
    return letterize($a) == letterize($b); 
} 

function letterize($a) { 
    $array = str_split(str_replace(' ', '', strtolower($a))); 
    sort($array); 
    return join($array); 
} 

$states = array('Alabama','Alaska','Arizona','Arkansas','California','Colorado', 
    'Connecticut','Delaware','Florida','Georgia','Hawaii','Idaho','Illinois', 
    'Indiana','Iowa','Kansas','Kentucky','Louisiana','Maine','Maryland', 
    'Massachusetts','Michigan','Minnesota','Mississippi','Missouri','Montana', 
    'Nebraska','Nevada','New Hampshire','New Jersey','New Mexico','New York', 
    'North Carolina','North Dakota','Ohio','Oklahoma','Oregon','Pennsylvania', 
    'Rhode Island','South Carolina','South Dakota','Tennessee','Texas','Utah', 
    'Vermont','Virginia','Washington','West Virginia','Wisconsin','Wyoming'); 

$doubleStates = array(); 

for ($i = 0, $max = count($states); $i < $max; $i++) { 
    for ($j = $i + 1; $j < $max; $j++) { 
     $doubleStates[] = $states[$i] . $states[$j]; 
    } 
} 

findAnagrams($doubleStates); 
+0

. 다른 경기는 어떨까요? 너무 일찍 멈춘 것 같습니다. 예를 들면 ... South Dakota & North Carolina? –

+0

예 사우스 다코타/노스 캐롤라이나 - 노스 다코타/사우스 캐롤라이나는 anagram입니다 – chrislondon

+0

다시 한번 감사드립니다. 나는 모든 가능성의 결과를 얻으 려 노력하면서 (원래의 문자열을 포함하고 역순으로), 배열에 배열을 넣은 다음 중복을 필터링했다. 말할 것도없이, 나는 아직 일하도록하지 않았다. –

관련 문제