Два способи перевірити паліндроми в JavaScript

Ця стаття заснована на сценарії базового алгоритму табору Free Code Camp «Перевірка паліндромів».

Паліндром - це слово, фраза, число або інша послідовність символів, що читає однаково назад або вперед. Слово «паліндром» вперше було введено англійським драматургом Бен Джонсоном у 17 столітті від грецьких коренів palin («знову») та dromos («шлях, напрямок»). - src. Вікіпедія

У цій статті я збираюся пояснити два підходи, перший із вбудованими функціями, а другий із використанням циклу for.

Виклик алгоритму

Повернути true, якщо даний рядок є паліндромом. В іншому випадку поверніть false.

Паліндром - це слово або речення, що пишеться однаково як вперед, так і назад, ігноруючи пунктуацію, регістр та інтервал.

Примітка. Вам потрібно буде видалити всі нелітерально-цифрові символи (розділові знаки, пробіли та символи) і повернути все з нижньої літери, щоб перевірити наявність паліндромів.

Ми передамо рядки з різними форматами, такими як "гоночний автомобіль", "гоночний автомобіль" та "гоночний автомобіль" серед інших.

function palindrome(str) { return true; } palindrome("eye");

Надані тестові кейси

  • паліндром («гоночний автомобіль») повинен повернутися істинним
  • паліндром (“не паліндром”)має повернути false
  • паліндром ("Людина, план, канал. Панама") повинен повернутися істинним
  • паліндром (“ніколи не непарний і не парний”) повинен повернутися істинним
  • паліндром (“ні”) повинен повернути false
  • паліндром ("майжеомла") повинен повернути помилковий
  • паліндром ("Мій вік - 0, 0 сі ега.") повинен повернутися істинним
  • паліндром («1 око на 1 око.») повинен повернути помилковий
  • паліндром (“0_0 (: / - \ :) 0–0”) повинен повернути true

Який регулярний вираз нам знадобиться для проходження останнього тесту?

Регулярні вирази - це шаблони, що використовуються для поєднання комбінацій символів у рядках.

Коли пошук збігу вимагає чогось більшого, ніж прямий збіг, шаблон включає спеціальні символи.

To pass the last test case, we can use two Regular Expressions: /[^A-Za-z0–9]/g or /[\W_]/g

\ W видаляє всі нелітерально-цифрові символи :

  • \ W відповідає будь-якому несловному символу
  • \ W еквівалентно [^ A-Za-z0–9_]
  • \ W відповідає всьому, що не вкладено в дужки

Що це означає?

[^A-Z] matches anything that is not enclosed between A and Z [^a-z] matches anything that is not enclosed between a and z [^0-9] matches anything that is not enclosed between 0 and 9 [^_] matches anything that does not enclose _

Але у нашому тестовому випадку нам потрібен паліндром (“ 0_0 (: / - \ :) 0–0 ”), щоб повернути true , що означає, що “ _ (: / - \ :) - ” має відповідати.

Нам потрібно буде додати “ _ ”, щоб пройти цей конкретний тест.

We now have “\W_”

Нам також потрібно буде додати прапор g для глобального пошуку.

We finally have “/[\W_]/g”
/ [\ W _] / g був використаний з чистою демонстративною метою, щоб показати, як працює RegExp. / [^ A-Za-z0–9] / g - це найпростіший у виборі RegExp .

1. Перевірте наявність паліндромів із вбудованими функціями

Для цього рішення ми використаємо кілька методів:

  • Метод toLowerCase () для повернення викличного значення рядка, перетвореного в нижній регістр.
  • Метод replace () для повернення нового рядка з деякими або всіма збігами шаблону, заміненого заміною. Ми використаємо один із RegExp, який ми щойно створили.
  • Метод split () розбиває об'єкт String на масив рядків, розділяючи рядок на підрядки.
  • Метод reverse () повертає масив на місце. Перший елемент масиву стає останнім, а останній стає першим.
  • Метод join () об’єднує всі елементи масиву у рядок.
function palindrome(str) { // Step 1. Lowercase the string and use the RegExp to remove unwanted characters from it var re = /[\W_]/g; // or var re = /[^A-Za-z0-9]/g; var lowRegStr = str.toLowerCase().replace(re, ''); // str.toLowerCase() = "A man, a plan, a canal. Panama".toLowerCase() = "a man, a plan, a canal. panama" // str.replace(/[\W_]/g, '') = "a man, a plan, a canal. panama".replace(/[\W_]/g, '') = "amanaplanacanalpanama" // var lowRegStr = "amanaplanacanalpanama"; // Step 2. Use the same chaining methods with built-in functions from the previous article 'Three Ways to Reverse a String in JavaScript' var reverseStr = lowRegStr.split('').reverse().join(''); // lowRegStr.split('') = "amanaplanacanalpanama".split('') = ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"] // ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"].reverse() = ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"] // ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"].join('') = "amanaplanacanalpanama" // So, "amanaplanacanalpanama".split('').reverse().join('') = "amanaplanacanalpanama"; // And, var reverseStr = "amanaplanacanalpanama"; // Step 3. Check if reverseStr is strictly equals to lowRegStr and return a Boolean return reverseStr === lowRegStr; // "amanaplanacanalpanama" === "amanaplanacanalpanama"? => true } palindrome("A man, a plan, a canal. Panama");

Без коментарів:

function palindrome(str) { var re = /[\W_]/g; var lowRegStr = str.toLowerCase().replace(re, ''); var reverseStr = lowRegStr.split('').reverse().join(''); return reverseStr === lowRegStr; } palindrome("A man, a plan, a canal. Panama");

2. Перевірте наявність паліндромів за допомогою циклу FOR

Напівіндексація (len / 2) має переваги при обробці великих рядків. Ми перевіряємо кінець з кожної частини і ділимо кількість ітерацій всередині циклу FOR на два.

function palindrome(str) { // Step 1. The first part is the same as earlier var re = /[^A-Za-z0-9]/g; // or var re = /[\W_]/g; str = str.toLowerCase().replace(re, ''); // Step 2. Create the FOR loop var len = str.length; // var len = "A man, a plan, a canal. Panama".length = 30 for (var i = 0; i < len/2; i++) { if (str[i] !== str[len - 1 - i]) { // As long as the characters from each part match, the FOR loop will go on return false; // When the characters don't match anymore, false is returned and we exit the FOR loop } /* Here len/2 = 15 For each iteration: i = ? i  if("a" !== "a")? // false 2nd iteration: 1 yes 2 if(str[1] !== str[15 - 1 - 1])? => if("m" !== "m")? // false 3rd iteration: 2 yes 3 if(str[2] !== str[15 - 1 - 2])? => if("a" !== "a")? // false 4th iteration: 3 yes 4 if(str[3] !== str[15 - 1 - 3])? => if("n" !== "n")? // false 5th iteration: 4 yes 5 if(str[4] !== str[15 - 1 - 4])? => if("a" !== "a")? // false 6th iteration: 5 yes 6 if(str[5] !== str[15 - 1 - 5])? => if("p" !== "p")? // false 7th iteration: 6 yes 7 if(str[6] !== str[15 - 1 - 6])? => if("l" !== "l")? // false 8th iteration: 7 yes 8 if(str[7] !== str[15 - 1 - 7])? => if("a" !== "a")? // false 9th iteration: 8 yes 9 if(str[8] !== str[15 - 1 - 8])? => if("n" !== "n")? // false 10th iteration: 9 yes 10 if(str[9] !== str[15 - 1 - 9])? => if("a" !== "a")? // false 11th iteration: 10 yes 11 if(str[10] !== str[15 - 1 - 10])? => if("c" !== "c")? // false 12th iteration: 11 yes 12 if(str[11] !== str[15 - 1 - 11])? => if("a" !== "a")? // false 13th iteration: 12 yes 13 if(str[12] !== str[15 - 1 - 12])? => if("n" !== "n")? // false 14th iteration: 13 yes 14 if(str[13] !== str[15 - 1 - 13])? => if("a" !== "a")? // false 15th iteration: 14 yes 15 if(str[14] !== str[15 - 1 - 14])? => if("l" !== "l")? // false 16th iteration: 15 no End of the FOR Loop*/ } return true; // Both parts are strictly equal, it returns true => The string is a palindrome } palindrome("A man, a plan, a canal. Panama");

Без коментарів:

function palindrome(str) { var re = /[^A-Za-z0-9]/g; str = str.toLowerCase().replace(re, ''); var len = str.length; for (var i = 0; i < len/2; i++) { if (str[i] !== str[len - 1 - i]) { return false; } } return true; } palindrome("A man, a plan, a canal. Panama");

Сподіваюсь, вам це було корисно. Це частина моєї серії “Як вирішити алгоритми FCC” про виклики, пов’язані з алгоритмом табору вільного коду, де я пропоную кілька рішень і покроково пояснюю, що відбувається під капотом.

Два способи підтвердити закінчення рядка в JavaScript

У цій статті я поясню, як вирішити проблему freeCodeCamp "Підтвердити закінчення".

Три способи змінити рядок у JavaScript

Ця стаття заснована на сценарії базового алгоритму табору Free Code Camp «Зворот рядка»

Три способи розкласти число на множники в JavaScript

Ця стаття заснована на сценарії базового алгоритму табору Free Code Camp “Розділення числа на факториали”

Три способи знайти найдовше слово в рядку в JavaScript

Ця стаття заснована на сценарії базового алгоритму табору Free Code Camp «Знайди найдовше слово в рядку».

Три способи озаглавити речення у JavaScript

Ця стаття заснована на сценарії базового алгоритму табору Free Code Camp “Заголовок - вирок”.

Три способи знайти найбільше число в масиві за допомогою JavaScript

У цій статті я збираюся пояснити, як вирішити проблему Free Return Camp “Повернути найбільші цифри в масиви”. Це ...

Якщо у вас є власне рішення чи будь-які пропозиції, поділіться ними нижче в коментарях.

Або ви можете стежити за мною на Medium , Twitter, Github та LinkedIn , відразу після того, як ви натиснете зелене серце внизу ;-)

# Будьте цікаві, # KeepOnHacking & # MakeItHappen!

Ресурси

  • Регулярні вирази - MDN
  • метод toLowerCase () - MDN
  • replace () - MDN
  • метод split () - MDN
  • метод зворотного () - MDN
  • метод join () - MDN
  • Довжина рядка - MDN
  • для - MDN