Как разделить строку во всех вариациях в PHP - PullRequest
2 голосов
/ 11 апреля 2011

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

ввод 'abc'

вывод 'abc / a, bc / ab, c / a, b, c'

или

вход' rrd '

выход' rrd / r, rd / rr, d / r, r, d '

спасибо

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

Проверьте этот «красивый» код, хороший мозговой тренажер для меня :)
Это определенно требует некоторой оптимизации, но отлично работает.
Примечание: 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
)
1 голос
/ 16 июля 2012

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

Как и в решении Анны, я нахожу все варианты 1 и 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;
    }

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

Ex. «Бит» String = 101 = разделители ',,' добавлены к исходной последовательности 1234 = '1,2 3,4'

Ex. Битовая строка = 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}\r\nInput Binary Variations: {1}\r\n", sequence, binaryVariations.Count());
        message += String.Format("Valid Alphabet Sequence Variations: {0}\r\nInvalid Alphabet Sequence Variations: {1}", satisfiedCnt, unsatisfiedCnt);
        result.Messsage = message;
        Console.WriteLine(message);

        return returnVal;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...