Ну во-первых, чего Вы хотели добиться вот этим кодом?
for (const letter of target) {
if ( letter.toLowerCase() !== letter.toUpperCase() ) {
direct = letter + direct;
reversed = letter + reversed;
}
}
Во-вторых, данная задача легко решается за O(n/2), а у Вас как минимум тут O(n):
target.split('').reverse().join('')
Нормальный алгоритм для этой задачи такой:
1. Заводим 2 переменные под индексы символов, одна будет смотреть на начало строки (изначальный индекс
0
), другая на конец строки (изначальный индекс
target.length - 1
).
2. Идем циклом по строке с обоих сторон, увеличивая первый индекс и уменьшая второй на каждой итерации.
2.1. Если символ под индексом не подходящий (пробел, знак препинания и т.д.), то его надо пропустить, сместив соответствующий индекс еще на 1 вне очереди. Подсказка: если нужна только латиница, то ее коды символов лежат в диапазонах 65-90 и 97-122 (у строки есть метод charCodeAt), для кириллицы диапазоны 1072-1103, 1040-1071, 1105, 1025.
2.2. Если текущие символы строки, с учетом приведения их к единому регистру не равны, то можно дальше не проверять и сразу возвращать false.
2.3. Если индексы стали равны или пересекли друг друга (индекс с конца меньше индекса с начала), то можно однозначно возвращать true.