Avatar billede wesso Juniormester
31. juli 2013 - 12:53 Der er 8 kommentarer og
1 løsning

Hvordan finder jeg alle mulige bogstavkombinationer af givne bogstaver dog...

Jeg vil gerne have en PHP script, der regner ud alle mulige bogstavkombinationer af givne bogstaver med maks antal bogstaver i output.

Dog ikke det samme bogstave fra det givne bogstaver mere end én gang med mindre den står i det givne ord mere en gang.

For eksempel:

- Givne bogstaver "ABCDE"

- Maks output bogstaver er 4

- Resultat kunne være OKAY: "CBED", "ACED", "DEAB", "BCDE" ...

- Men IKKE OKAY: "AABC" eller "BCCC"


Men hvis
--------
- Givne bogstaver "ABCCD"

- Maks output bogstaver er 4

- Resultat kunne være OKAY: "CBEC", "ACCD", "DABC", "ABCC" ...

- Men IKKE OKAY (mere end 2 C'er, da det står i givne ord): "AABC" eller "BCCC"


På forhånd tak
Avatar billede michael_stim Ekspert
31. juli 2013 - 16:24 #1
Her er en funktion jeg fandt og lavede lidt om på:


<?php

function permute($str) {
    /* If we only have a single character, return it */
    if (strlen($str) < 2) {
        return array($str);
    }

    /* Initialize the return value */
    $permutations = array();

    /* Copy the string except for the first character */
    $tail = substr($str, 1);

    /* Loop through the permutations of the substring created above */
    foreach (permute($tail) as $permutation) {
        /* Get the length of the current permutation */
        $length = strlen($permutation);

        /* Loop through the permutation and insert the first character of the original
        string between the two parts and store it in the result array */
        for ($i = 0; $i <= $length; $i++) {
            $permutations[] = substr($permutation, 0, $i) . $str[0] . substr($permutation, $i);
        }
    }

    /* Return the result */
    return $permutations;
}

$str="aabcd";
$length_perm = 4; //Antal bogstaver der skal bruges
$permutations = array_unique(permute($str));
foreach($permutations as $word) {
$permutations_n[] = substr($word,0,$length_perm);
}
$i=1;
$permutations_nu = array_unique($permutations_n);
foreach($permutations_nu as $word) {
echo $word." ".$i;
echo "<br>" ;
$i++;
}
?>
Avatar billede arne_v Ekspert
31. juli 2013 - 16:33 #2
Det er der flere maader at goere paa.

Her er en:

<?php
function perm_help($ca, $res, $used, $len, $f) {
    if(strlen($res) >= $len) {
        $f($res);
    } else {
        for($i = 0; $i < count($ca); $i++) {
            if(!$used[$i]) {
                $used[$i] = true;
                perm_help($ca, $res . $ca[$i], $used, $len, $f);
                $used[$i] = false;
            }   
        }
    }
}

function perm($ca, $len, $f) {
    perm_help($ca, '', array_fill(0, count($ca), false), $len, $f);
}

function printperm($res) {
    echo "$res\r\n";
}

perm(array('A', 'B', 'C', 'D', 'E'), 4, 'printperm');
?>
Avatar billede michael_stim Ekspert
31. juli 2013 - 16:54 #3
#2

Den returnerer forkert resultat, hvis der f eks er 2 ens bogstaver.
Avatar billede arne_v Ekspert
31. juli 2013 - 17:02 #4
Den vil outputte samme resultat flere gange hvis dette resultat kan laves paa flere forskellige maader.

Og det kan vaere forkert.
Avatar billede arne_v Ekspert
31. juli 2013 - 17:13 #5
Man kan dog teste for duplikater:

<?php
function perm_help($ca, $res, $used, &$dupl, $len, $f) {
    if(strlen($res) >= $len) {
        if(!array_key_exists ($res, $dupl)) {
            $dupl[$res] = true;
            $f($res);
        }
    } else {
        for($i = 0; $i < count($ca); $i++) {
            if(!$used[$i]) {
                $used[$i] = true;
                perm_help($ca, $res . $ca[$i], $used, $dupl, $len, $f);
                $used[$i] = false;
            }   
        }
    }
}

function perm($ca, $len, $f) {
    $dupl = array();
    perm_help($ca, '', array_fill(0, count($ca), false), $dupl, $len, $f);
}

function printperm($res) {
    echo "$res\r\n";
}

perm(array('A', 'B', 'C', 'D', 'E'), 4, 'printperm');
perm(array('A', 'A', 'B'), 2, 'printperm');
?>
Avatar billede wesso Juniormester
01. august 2013 - 10:40 #6
Tak for jeres input ..

Jeg tester scripterne i løbet af dagen og vender tilbage
Avatar billede wesso Juniormester
14. august 2013 - 13:32 #7
Hej Martin og Arne

Hvordan kan jeg give jer begge to point ?
Avatar billede michael_stim Ekspert
14. august 2013 - 13:45 #8
Hvis du mener mig, så samler jeg ikke på point. Ellers er det bare at vente til arne_v har lagt et svar og så acceptere hans svar, så er spørgsmålet lukket.
Avatar billede arne_v Ekspert
15. august 2013 - 03:27 #9
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester