Popular puzzle for interview
- Published on
- Authors
- Name
- Vasiliy Kramarenko
- @kramvas07
Палиндром
Палиндром — число, слово или текст, одинаково читающееся в обоих направлениях. Например: радар, топот.
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);
});