Переворачивание слов из строки

Дана строка состоящая из слов разделенных одним или несколькими разделителями(пробел, точка, запятая). Необходимо перевернуть каждое слово в строке не нарушая при этом порядок слов.

Входные данные

Строка символов.

Выходные данные

Строка с перевернутыми словами.

using System;

class Program
{
    /// <summary>
    /// метод для получения индекса разделителя строки
    /// </summary>
    /// <param name="phrase">строка</param>
    /// <param name="startIndex">позиция начала поиска разделителя</param>
    /// <param name="separators">массив допустимых разделителей</param>
    /// <param name="currentSeparator">текущий разделитель</param>
    /// <returns>индекс разделителя или -1, если разделитель не найден</returns>
    static int IndexOf(string phrase, int startIndex, char[] separators, out char currentSeparator)
    {
        currentSeparator = ' ';
        for (var i = startIndex; i < phrase.Length; i++)
        {
            for (var j = 0; j < separators.Length; j++)
            {
                if (phrase[i] == separators[j])
                {
                    currentSeparator = separators[j];
                    return i;
                }
            }
        }

        //если разделитель не найден
        return -1;
    }

    static string WordsReverse(string phrase)
    {
        var phraseLength = phrase.Length;
        var retValue = new char[phraseLength];
        var wordStartIndex = 0;

        while (wordStartIndex < phraseLength)
        {
            var separatorIndex = IndexOf(phrase, wordStartIndex, new[] { ' ', ',', '.' }, out char currentSeparator);
            if (separatorIndex == -1)
            {
                separatorIndex = phrase.Length;
            }
            else
            {
                retValue[separatorIndex] = currentSeparator;
            }

            var currentIndex = wordStartIndex;
            for (var i = separatorIndex - 1; i >= wordStartIndex; i--)
            {
                retValue[currentIndex] = phrase[i];
                currentIndex++;
            }

            wordStartIndex = separatorIndex + 1;
        }

        return new string(retValue);
    }

    static void Main(string[] args)
    {
        var text = Console.ReadLine();
        Console.WriteLine(WordsReverse(text));
        Console.ReadKey();
    }
}

Смотрите также: