2013-10-02 2 views
0

Я пытаюсь написать функцию, которая будет принимать, давайте скажем «эй там», а затем создайте массив всех префикса этой строки. Таким образом, он будет возвращать «h», «he», «hey», «hey», «hey t» и т. Д. И т. Д.Получить всю возможную комбинацию (префикс/суффикс) строки

Тогда я хотел бы, чтобы одна и та же функция создавала второй массив из всех суффиксов Струна). поэтому для той же строки он будет возвращать «e», «er», «ere», «ereh», «ereht», «ereht» и т. д.

Я немного обманываю, чтобы понять это, но мне удалось чтобы получить следующее, которое получает все возможные комбинации строки, мне просто нужно заставить ее сделать это только по порядку.

$str = "hey there"; 

function permute($str,$i,$n) { 
    if ($i == $n) 
     print "$str\n"; 
    else { 
     for ($j = $i; $j < $n; $j++) { 
      swap($str,$i,$j); 
      permute($str, $i+1, $n); 
      swap($str,$i,$j); // backtrack. 
     } 
    } 
} 

// function to swap the char at pos $i and $j of $str. 
function swap(&$str,$i,$j) { 
    $temp = $str[$i]; 
    $str[$i] = $str[$j]; 
    $str[$j] = $temp; 
} 

permute($str,0,strlen($str)); // call the function. 

} 

Любая помощь очень ценится.

+1

Комбинация substr, strrev и loop будет делать трюк. – Virus721

+0

Не дубликат, я не хочу генерировать все комбинации, как указано в сообщении. Пожалуйста, прочитайте его перед комментарием, и я вижу, что я проверю эти функции отблагодарить. –

+0

Вряд ли стоит ответить: 'function permute ($ string) { $ length = strlen ($ string); $ result = array(); for ($ i = 1; $ i <= $ length; $ i ++) { $ result [] = substr ($ string, 0, $ i); } return $ result; } function permuteboth ($ string) { $ results = array(); $ results [] = permute ($ string); $ results [] = permute (strrev ($ string)); return $ results; } $ str = "эй там"; $ results = permuteboth ($ str); var_dump ($ results); ' –

ответ

2

Это то, что вы пытаетесь сделать?

<?php 
    function getPrefixSuffix($string, &$prefixes = array(), &$suffixes = array()) { 
     $stringLength = strlen($string); 
     for ($i = 1; $i < $stringLength; $i++) { 
      $prefixes[] = substr($string, 0, $i); 
     } 
     for ($i = $stringLength - 1; $i >= 1; $i--) { 
      $suffixes[] = strrev(substr($string, $i)); 
     } 
    } 

    getPrefixSuffix("hey there", $prefixes, $suffixes); 

    print_r($prefixes); 
    /* 
     Array 
     (
      [0] => h 
      [1] => he 
      [2] => hey 
      [3] => hey 
      [4] => hey t 
      [5] => hey th 
      [6] => hey the 
      [7] => hey ther 
     ) 
    */ 

    print_r($suffixes); 
    /* 
     Array 
     (
      [0] => e 
      [1] => er 
      [2] => ere 
      [3] => ereh 
      [4] => ereht 
      [5] => ereht 
      [6] => ereht y 
      [7] => ereht ye 
     ) 
    */ 
?> 

DEMO

0

будет простой для цикла, и пара подстрочных тоже сделает то же самое?

$prefixes = array(); 
$suffixes = array(); 
$str = "hey there"; 
$l = strlen($str); 
for($i=1; $i<$l; $i++) { 
    $prefixes[] = substr($str, 0, $i); 
    $suffixes[] = strrev(substr($str, $l-$i, $i)); 
} 

demo

+0

Добавьте' strrev' в '$ suffixes', поскольку OP хочет, чтобы он был' ereht' вместо 'there'. – h2ooooooo

0

Это должно работать. Я написал 3 функции. Первая из них просто получает все префиксы, печатаясь при каждом добавлении. Третий - это метод обмена, который вы написали. Второй просто сворачивает назад строку, а затем вызывает getPrefix. Обратите внимание, что исходная строка остается нетронутой.

$str = "hey there" 

function getPrefix($str) 
{ 
    $printString = ""; 
    for ($i = 0; $i < strlen($str); $i++) 
    { 
     $printString .= $str[$i]; 
     print ($printString); 
    } 
} 

function getBackwards($str) 
{ 
    if (strlen($str) % 2 == 0) 
    { 
     for ($i = 0; $i < strlen($str)/2; $i++) 
      swap ($str, $i, strlen($str)-1-$i); 
    } 
    else 
    { 
     for ($i = 0; $i < (strlen($str)-1)/2; $i++) 
      swap ($str, $i, strlen($str)-1-$i); 
    } 
    getPrefix($str); 
} 

function swap(&$str,$i,$j) 
{ 
    $temp = $str[$i]; 
    $str[$i] = $str[$j]; 
    $str[$j] = $temp; 
} 
Смежные вопросы