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

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

Для перевірки чи є рядок паліндромом чи ні, можна використати декілька різних підходів. Розглянемо ті, що найчастіше зустрічаються.

Порівняння рівновіддалених від центру символів

Для отримання результату будемо послідовно порівнювати перший символ з останнім, другий з передостаннім і т.д. Якщо символи відрізняються то зразу повертаємо значення 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;
}

Дивіться також: