Как разделить строку во всех вариантах PHP

#php #string #permutation

#php #строка #Перестановка

Вопрос:

Прошу прощения за мой английский. Мне нужна функция для разделения строки во всех вариантах, порядок и длина остаются неизменными.

введите ‘abc’

выведите ‘abc / a,bc / ab, c / a, b, c’

или

введите ‘rrd’

выведите ‘rrd / r,rd / rr, d / r, r, d’

Спасибо

Ответ №1:

Проверьте этот «красивый» код, хороший тренажер для мозга для меня 🙂
Это определенно нуждается в некоторой оптимизации, но работает идеально.
Примечание: array_reverse() и strrev() можно удалить, но так порядок выглядит лучше.

 function TheFunction($s) {
    for($i=strlen($s)-1;$i>0;$i--) $h .= '1';
    $z = str_replace('1','0',$h);
    for($i=bindec($h);$i>=0;$i--) $array[] = strrev(substr_replace($z, decbin($i), strlen($z)-strlen(decbin($i))));
    foreach($array as $value){
        $value = str_replace(array('0','1'),array(' ',','),$value);
        $string = '';
        for($i=0;$i<strlen($s)-1;$i  ) $string .= $s[$i].$value[$i];
        $string .= $s[strlen($s)-1];
        $results[] = str_replace(' ','',$string);
    }
    return array_reverse($results);
}
  

Пример

 print_r(TheFunction('Anne'));
  

ВОЗВРАТ

 Array
(
    [0] => Anne
    [1] => A,nne
    [2] => An,ne
    [3] => A,n,ne
    [4] => Ann,e
    [5] => A,nn,e
    [6] => An,n,e
    [7] => A,n,n,e
)
  

Другой пример

 print_r(TheFunction('Stack'));
  

ВОЗВРАТ:

 Array
(
    [0] => Stack
    [1] => S,tack
    [2] => St,ack
    [3] => S,t,ack
    [4] => Sta,ck
    [5] => S,ta,ck
    [6] => St,a,ck
    [7] => S,t,a,ck
    [8] => Stac,k
    [9] => S,tac,k
    [10] => St,ac,k
    [11] => S,t,ac,k
    [12] => Sta,c,k
    [13] => S,ta,c,k
    [14] => St,a,c,k
    [15] => S,t,a,c,k
)
  

Ответ №2:

Я сделал что-то похожее на Anne, за исключением того, что я использовал класс Variations от Adrian Akison здесь.

Как и в решении Энн, я нахожу все варианты единиц и 0 (Variations.cs) длиной на 1 меньше исходной строки. Это делается с учетом смещения запятой. Обратите внимание, что позже я заменю 1 запятыми, а 0 — пустым пробелом.

«Битная» строка 111 = «,,,» или 101 = «, , ,» и т. Д

Итак, получите все варианты определенного размера, используя определенные символы, в данном случае 1 и 0:

     private HashSet<string> fetchBinaryVariations(int size)
    {
        HashSet<string> returnVal = new HashSet<string>();
        String variationResultItem = string.Empty;
        string[] oneZero = { "1", "0" };

        /* Generate all variations of 1's and 0's given size using Adrian Akison's handy dandy variations class */
        Variations<string> variationsList = new Variations<string>(oneZero.ToList<string>(), size, GenerateOption.WithRepetition);
        Console.WriteLine("Total Variations: {0}", variationsList.Count());

        foreach (List<string> variationItem in variationsList)
        {
            variationResultItem = String.Join("", variationItem);
            returnVal.Add(variationResultItem);
            // Console.WriteLine("Variation: {0}", variationResultItem);
        }
        return returnVal;
    }
  

Далее я беру эти «битовые» строки, преобразую их в запятые и пробелы и объединяю их с моей исходной последовательностью. В моем случае у меня есть еще один шаг, на котором я декодирую цифры в буквы, используя перечисление (не показано):

Например. Строка «Bit» = 101 = разделители ‘, ,’, добавленные к исходной последовательности 1234 = ‘1,2 3,4’

Например. Строка «Bit» = 111 = разделители ‘,,,’, добавленные к исходной последовательности 1234 = ‘1,2,3,4’

     private Dictionary<string, string> processDeliminatorsWithInputSequence(string sequence, HashSet<string> binaryVariations)
    {
        Dictionary<string, string> returnVal = new Dictionary<string, string>();
        string message = string.Empty, variationWithDelim = string.Empty, finalString = string.Empty;
        StringBuilder characterContainer = null;
        int satisfiedCnt = 0, unsatisfiedCnt = 0;

        foreach (string variation in binaryVariations)
        {
            variationWithDelim = variation.Replace('0', ' ').Replace('1', ','); // 0's are spaces and 1's are commas
            characterContainer = new StringBuilder();
            for (int i = 0; i < sequence.Length - 1; i  )
            {
                characterContainer.Append(sequence[i]); // Original Input
                characterContainer.Append(variationWithDelim[i]); // Append with space or comma
            }
            characterContainer.Append(sequence[sequence.Length - 1]); // Need to append last character from original input - offset again
            characterContainer.Replace(" ", ""); // Clean up empty spaces in final string

            finalString = decodeToAlphabet(characterContainer); // converat numerals to their alpha equivelant
            if (finalString != null)
                returnVal.Add(characterContainer.ToString(), finalString); // Add original encoding and decoded strings to hastable
            else
                unsatisfiedCnt  ;

            satisfiedCnt = returnVal.Count();
        }

        message = String.Format("Input Sequence: {0}rnInput Binary Variations: {1}rn", sequence, binaryVariations.Count());
        message  = String.Format("Valid Alphabet Sequence Variations: {0}rnInvalid Alphabet Sequence Variations: {1}", satisfiedCnt, unsatisfiedCnt);
        result.Messsage = message;
        Console.WriteLine(message);

        return returnVal;
    }