Палиндром – слово, число, набор символов, словосочетание, которое одинаково читается в обоих направлениях(справа налево и слева направо).

Текстовые палиндромы

Для проверки является строка палиндромом или нет можно использовать несколько различных подходов. Рассмотрим наиболее часто используемые.

Сравнение равноудаленных от центра символов

Для получения результата будем последовательно сравнивать первый символ с последним, второй с предпоследним и т.д. Если символы отличаются то сразу возвращаем значение false.

static bool IsPalindrom(string word, bool ignoreCase = true)
{
    if (ignoreCase)
    {
        word = word.ToLowerInvariant();
    }

    for (int first = 0, last = word.Length - 1; first < last; ++first, --last)
    {
        if (word[first] != word[last])
        {
            return false;
        }
    }

    return true;
}

Данный метод не использует дополнительных массивов и строк для хранения данных.

Сравнение с перевернутой строкой

Для реализации этого метода, необходимо перевернуть строку, а затем сравнить её с исходной.

static bool IsPalindrom(string word, bool ignoreCase = true)
{
    var reversedWord = new string(word.Reverse().ToArray());
    bool result;
    if (ignoreCase)
    {
        result = reversedWord.Equals(word, StringComparison.InvariantCultureIgnoreCase);
    }
    else
    {
        result = reversedWord.Equals(word);
    }

    return result;
}

Сравнение массивов символов исходной и перевернутой строк

Этот вариант не отличается от предыдущего, за исключением того, что в сравнении участвуют массивы символов, которые мы получаем из строк.

static bool IsPalindrom(string word, bool ignoreCase = true)
{
    if (ignoreCase)
    {
        word = word.ToLowerInvariant();
    }

    var inputArray = word.ToArray();
    var reversedArray = inputArray.Reverse().ToArray();

    return inputArray.SequenceEqual(reversedArray);
}

Числовые палиндромы

Для определения числа палиндрома, можно преобразовать его в текстовую строку, и использовать один из выше рассмотренных методов. Или разбить число на отдельные цифры, и манипулировать с полученным массивом цифр.

// метод для получения списка цифр из числа
static List<uint> UintToDigits(uint number)
{
    var digits = new List<uint>();
    while (number > 0)
    {
        digits.Add(number % 10);
        number /= 10;
    }

    return digits;
}

static bool IsPalindrom(uint number)
{
    var digitList = UintToDigits(number);
    for (int firstIndex = 0, lastIndex = digitList.Count - 1; firstIndex < lastIndex; ++firstIndex, --lastIndex)
    {
        if (digitList[firstIndex] != digitList[lastIndex]) return false;
    }

    return true;
}

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