복붙노트

어떻게 PHP에서 문자열의 모든 순열을 생성 할 수 있습니까?

PHP

어떻게 PHP에서 문자열의 모든 순열을 생성 할 수 있습니까?

한 문자열에 모든 문자의 가능한 모든 조합을 반환하는 알고리즘이 필요합니다.

난 노력 했어:

$langd = strlen($input);
 for($i = 0;$i < $langd; $i++){
     $tempStrang = NULL;
     $tempStrang .= substr($input, $i, 1);
  for($j = $i+1, $k=0; $k < $langd; $k++, $j++){
   if($j > $langd) $j = 0;
   $tempStrang .= substr($input, $j, 1);
 }
 $myarray[] = $tempStrang;
}

하지만 문자열의 길이와 같은 금액의 조합 만 반환합니다.

$ input = "hey"라고 말하면, 결과는 다음과 같을 것입니다 : hey, hye, eyh, ehy, yhe, yeh.

해결법

  1. ==============================

    1.역 추적 기반 접근법을 사용하여 모든 순열을 체계적으로 생성 할 수 있습니다.

    역 추적 기반 접근법을 사용하여 모든 순열을 체계적으로 생성 할 수 있습니다.

    // function to generate and print all N! permutations of $str. (N = strlen($str)).
    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;
    }   
    
    $str = "hey";
    permute($str,0,strlen($str)); // call the function.
    

    산출:

    #php a.php
    hey
    hye
    ehy
    eyh
    yeh
    yhe
    
  2. ==============================

    2.내 변형 (배열 또는 문자열 입력과 잘 작동 함)

    내 변형 (배열 또는 문자열 입력과 잘 작동 함)

    function permute($arg) {
        $array = is_string($arg) ? str_split($arg) : $arg;
        if(1 === count($array))
            return $array;
        $result = array();
        foreach($array as $key => $item)
            foreach(permute(array_diff_key($array, array($key => $item))) as $p)
                $result[] = $item . $p;
        return $result;
    }
    

    추신 : 당신의 위치를 ​​설명해주십시오. 이 코드는 추가 str_split 및 array_diff_key 표준 함수를 사용하지만이 코드 스니 j은 가장 작고 단 하나의 입력 매개 변수로 순수 꼬리 순환을 구현하며 입력 데이터 유형과 동 형입니다.

    어쩌면 벤치 마크를 다른 구현과 비교할 때 약간의 손실을 가져올 것입니다 (그러나 성능은 실제로 @ codaddict의 여러 문자열에 대한 응답과 거의 동일합니다). 그러나 왜 우리는 그것을 다른 대안 중 하나로 간주 할 수없는 것일까? 자신의 장점?

  3. ==============================

    3.모든 문자를 배열에 넣고 나머지 문자를 모두 스트라이프하는 재귀 함수를 작성합니다. 배열이 하늘의 경우, 참조를 건네받은 배열에 건네줍니다.

    모든 문자를 배열에 넣고 나머지 문자를 모두 스트라이프하는 재귀 함수를 작성합니다. 배열이 하늘의 경우, 참조를 건네받은 배열에 건네줍니다.

    <?php
    
    $input = "hey";
    
    function string_getpermutations($prefix, $characters, &$permutations)
    {
        if (count($characters) == 1)
            $permutations[] = $prefix . array_pop($characters);
        else
        {
            for ($i = 0; $i < count($characters); $i++)
            {
                $tmp = $characters;
                unset($tmp[$i]);
    
                string_getpermutations($prefix . $characters[$i], array_values($tmp), $permutations);
            }
        }
    }
    $characters = array();
    for ($i = 0; $i < strlen($input); $i++)
        $characters[] = $input[$i];
    $permutations = array();
    
    print_r($characters);
    string_getpermutations("", $characters, $permutations);
    
    print_r($permutations);
    

    인쇄물 :

    Array
    (
        [0] => h
        [1] => e
        [2] => y
    )
    Array
    (
        [0] => hey
        [1] => hye
        [2] => ehy
        [3] => eyh
        [4] => yhe
        [5] => yeh
    )
    

    아 예, 조합 = 순서 doens't 문제. 순열 = 순서가 중요합니다.

    안녕하세요, 예이 같은 조합은 모두 같지만 언급 된 3 개의 별개의 순열입니다. 항목의 크기가 매우 빠르게 증가하는지 조심하십시오. 그것은 계승 (factorial)이라고 불리며 6과 같이 쓰여집니다! = 6 * 5 * 4 * 3 * 2 * 1 = 720 항목 (6 자 문자열의 경우). 10 자 문자열은 10입니다! = 3628800 순열은 이미 매우 큰 배열입니다. 이 예제에서는 3입니다! = 3 * 2 * 1 = 6이다.

  4. ==============================

    4.내 접근 방식은 재귀와 루프를 사용하지 않으므로 확인하고 피드백을주십시오.

    내 접근 방식은 재귀와 루프를 사용하지 않으므로 확인하고 피드백을주십시오.

    function permute($str,$index=0,$count=0)
    {
        if($count == strlen($str)-$index)
            return;
    
        $str = rotate($str,$index);
    
        if($index==strlen($str)-2)//reached to the end, print it
        {
            echo $str."<br> ";//or keep it in an array
        }
    
        permute($str,$index+1);//rotate its children
    
        permute($str,$index,$count+1);//rotate itself
    }
    
    function rotate($str,$index)
    {
        $tmp = $str[$index];
        $i=$index;
        for($i=$index+1;$i<strlen($str);$i++)
        {
            $str[$i-1] = $str[$i];
        }
        $str[$i-1] = $tmp;
        return $str;
    }
    permute("hey");
    
  5. from https://stackoverflow.com/questions/2617055/how-to-generate-all-permutations-of-a-string-in-php by cc-by-sa and MIT license