Эта статья основана на задаче Проверка палиндромов от freeCodeCamp учебной программы Алгоритмы JavaScript и структуры данных.

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

Итак, давайте начнем с определения того, что такое палиндром. Палиндром — это слово или предложение, которые пишутся одинаково как в прямом, так и в обратном порядке без учета пунктуации, регистра и пробелов.

В объяснении задачи нам подсказывают, как подойти к созданию алгоритма проверки палиндромов.

Во-первых, в нем говорится, что вам нужно удалить все небуквенно-цифровые символы (пунктуацию, пробелы и символы). Какой отличный трюк! Прежде чем удалить что-то из любого места, мы должны сначала обнаружить это. Но подождите секунду, как я могу обнаружить ВСЕ не буквенно-цифровые символы? Да, вы абсолютно правы! Регулярные выражения. RegExp — это шаблоны, используемые для сопоставления комбинаций символов в строках. Для получения дополнительной информации о RegExp и о том, как их использовать, ознакомьтесь со статьей MDN здесь.

В этой задаче мы можем использовать символы \W, которые соответствуют любому символу, не являющемуся символом слова из основного латинского алфавита. Эквивалентно [^A-Za-z0–9_]. Например, /\W/ или /[^A-Za-z0–9_]/ соответствует "%" в " 50%”.

Давайте начнем писать нашу первую строку для решения:

// store our RegExp in a variable called "re"
let re = /[\W_]/g;

И наш второй трюк заключается в том, чтобы перевести все в один и тот же регистр (нижний или верхний регистр)

// first we turn our string to lowercase and use our RegExp to remove unwanted characters in the same line.
const lowStr = str.toLowerCase().replace(re, "");

После этого мы используем цикл for, чтобы проверить символы в строке на предмет того, является ли она палиндромом. Для этого мы сначала решаем, каким будет наш номер итерации. Давайте подумаем о такой строке, как almostomla. Его длина равна 10, и чтобы он стал палиндромом, 1-й символ должен совпадать с 10-м, 2-й с 9-м, 3-й с 8-м, 4-й с 7-м и 5-й с 6-м. Как видите, в этом примере наш номер итерации равен 5. Это всего лишь половина длины строки. Определив номер итерации, давайте напишем наш цикл.

// first store our string length
let strLen = lowStr.length;
for (let i = 0; i < strLen / 2; i++) {
if (lowStr[i] !== lowStr[strLen - i - 1]) {
return false;
}
}
return true;

И вот наше окончательное решение для прохождения испытания:

function palindrome(str) {
let re = /[\W_]/g;
const lowStr = str.toLowerCase().replace(re, "");
let strLen = lowStr.length;
for (let i = 0; i < strLen / 2; i++) {
if (lowStr[i] !== lowStr[strLen - i - 1]) {
return false;
}
}
return true;
}

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

Если вы хотите связаться со мной, вот мои профили:

github, linkedin и twitter.