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