Popular puzzle for interview

Published on
Authors

Палиндром

Палиндром — число, слово или текст, одинаково читающееся в обоих направлениях. Например: радар, топот.

isPalindrome.js Реализуйте и экспортируйте по умолчанию функцию isPalindrome с использованием рекурсии.

Примеры использования:

import isPalindrome from './isPalindrome';

isPalindrome('radar'); // true
isPalindrome('a');     // true
isPalindrome('abs');   // false

Один из способ реализовать эту функцию — попарно сравнить буквы, стоящие зеркально относительно центра. Если они совпадают, то перед нами палиндром.

Алгоритм Если строка короче двух символов, то считается, что это палиндром. Проверяем, совпадают ли первый и последний символы. Если нет, то это не палиндром. Если совпадают, то вызываем функцию рекурсивно, передавая внутрь строку минус первый и последний символ. Разбор на примере: radar (палиндром)

Первый и последний символ r. Так как символы совпали, вызываем isPalindrome рекурсивно. Дальше передаем ada Первый и последний символ a. Так как символы совпали, вызываем isPalindrome рекурсивно. Дальше передаем d Так как длина строки d меньше двух символов, возвращаем true Разбор на примере: rador (не палиндром)

Первый и последний символ r. Так как символы совпали, вызываем isPalindrome рекурсивно. Дальше передаем ado Первый символ a и последний символ o. Так как символы не совпали, возвращаем false Подсказки Чтобы узнать длину строки, используйте свойство length:

'hello'.length; // 5 Чтобы получить подстроку из строки, используйте метод substring:

'hello'.substring(0, 4); // "hell" 'hello'.substring(1, 3); // "el"

Решение

const isPalindrome = (string) => {
  if (string.length <= 1) {
    return true;
  }

  const firstSymbol = string[0];
  const lastSymbol = string[string.length - 1];

  if (firstSymbol !== lastSymbol) {
    return false;
  }

  const stringWithoutFirstAndLastSymbols = string.substring(1, string.length - 1);

  return isPalindrome(stringWithoutFirstAndLastSymbols);
};

export default isPalindrome;

Тест

import isPalindrome from '../isPalindrome';

test('isPalindrome', () => {
  expect(isPalindrome('a')).toBe(true);
  expect(isPalindrome('aa')).toBe(true);
  expect(isPalindrome('404')).toBe(true);
  expect(isPalindrome('abba')).toBe(true);
  expect(isPalindrome('radar')).toBe(true);
  expect(isPalindrome('absba')).toBe(true);
  expect(isPalindrome('aibohphobia')).toBe(true);

  expect(isPalindrome('abaoba')).toBe(false);
  expect(isPalindrome('aashgkhdj')).toBe(false);
  expect(isPalindrome('palindrome')).toBe(false);
  expect(isPalindrome('aibohapohobia')).toBe(false);
});