Valid palindrome (opens in a new tab)
var isPalindrome = function(s) {
let cleanStr = s.replace(/\W/g, '').toLowerCase();
let p = 0;
let p2 = cleanStr.length - 1;
while(p < p2) {
if (cleanStr[p] !== cleanStr[p2]) {
return false
}
p++;
p2--;
}
return true;
};
- Регулярное выражение
[^a-z0-9]
используется для поиска всех символов, которые не являются ни буквами английского алфавита (нижний или верхний регистр), ни числами. Получившаяся строка затем приводится к нижнему регистру чтобы обеспечить регистронезависимое сравнение символов. - Устанавливаются два указателя: один
(p)
в начале очищенной строки, второй(p2)
в конце. - Затем, пока указатели не встретятся прямо посредине строки, мы сравниваем символы, на которые указывают
p
иp2
. - Если символы равны, мы продолжаем движение вперед / назад и сравниваем следующую пару символов.
- Если символы не равны, возвращаем
false
- это значит, что строка не является палиндромом. - Если все пары символов совпадают и
p
иp2
встречаются посредине, возвращаемtrue
- это значит, что строка является палиндромом.
Алгоритмическая сложность:
Сложность алгоритма составляет O(n)
, где n
- это длина входной строки s
.
Временная сложность:
- Приведение к нижнему регистру и замена недопустимых символов
(O(n))
: Это зависит от длины входной строки, поскольку ее каждый символ просматривается и заменяется по необходимости. - Обход строки
(O(n))
: Подобно первому шагу, этот зависит от длины строки, поскольку мы проходим по половине символов строки.
Таким образом, общая временная сложность составляет O(n) + O(n) = O(n)
.
Пространственная сложность:
- Память для
cleanStr (O(n))
: Нам требуется дополнительное пространство для хранения очищенной строки.
Таким образом, пространственная сложность составляет O(n)
.
В целом, алгоритм является эффективным, так как он выполняет только один проход по входной строке, минимизируя использование дополнительной памяти.