Два начина за проверка за палиндроми в JavaScript

Тази статия се основава на скриптове за базисен алгоритъм на Free Code Camp „Проверка за палиндроми“.

Палиндромът е дума, фраза, число или друга последователност от символи, която чете същото назад или напред. Думата „палиндром“ е въведена за първи път от английския драматург Бен Джонсън през 17 век, от гръцките корени palin („отново“) и dromos („път, посока“). - src. Уикипедия

В тази статия ще обясня два подхода, първо с вградени функции и втори с помощта на цикъл for.

Предизвикателство на алгоритъма

Връща true, ако даденият низ е палиндром. В противен случай върнете false.

Палиндромът е дума или изречение, което се изписва по същия начин както напред, така и назад, като се игнорират пунктуацията, регистъра и интервала.

Забележка. Ще трябва да премахнете всички буквено-цифрови символи (пунктуация, интервали и символи) и да обърнете всичко с малки букви, за да проверите за палиндроми.

Ще предадем низове с различни формати, като „racecar“, „RaceCar“ и „race CAR“, наред с други.

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

Предоставени тестови случаи

  • палиндромът („състезателна кола“) трябва да върне вярно
  • палиндром („не палиндром“)трябва да върне false
  • палиндром („Човек, план, канал. Панама“) трябва да се върне вярно
  • палиндромът („никога нечетен или четен“) трябва да се върне вярно
  • palindrome (“nope”) трябва да върне false
  • палиндромът (“почтиумла”) трябва да върне false
  • палиндромът („Моята възраст е 0, 0 си ega ym.“) трябва да върне вярно
  • палиндромът („1 око за 1 око.“) трябва да върне фалшиво
  • палиндром (“0_0 (: / - \ :) 0–0”) трябва да върне вярно

Кой регулярен израз ще ни трябва, за да преминем последния тест?

Регулярните изрази са модели, използвани за съвпадение на комбинации от символи в низове.

Когато търсенето на съвпадение изисква нещо повече от директно съвпадение, шаблонът включва специални знаци.

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“ за предизвикателствата на алгоритъма на Free Code Camp, където предлагам няколко решения и обяснявам стъпка по стъпка какво се случва под капака.

Два начина за потвърждаване на края на низ в JavaScript

В тази статия ще ви обясня как да решите предизвикателството „Потвърдете края“ на freeCodeCamp.

Три начина за обръщане на низ в JavaScript

Тази статия се основава на скриптове „Обратен низ“ на алгоритъма „Основен алгоритъм“.

Три начина за факторизиране на число в JavaScript

Тази статия се основава на скриптове за базисен алгоритъм на Free Code Camp „Факторизиране на число“

Три начина за намиране на най-дългата дума в низ в JavaScript

Тази статия се основава на скриптове за основен алгоритъм на Free Code Camp „Намерете най-дългата дума в низ“.

Три начина за озаглавяване на изречение в JavaScript

This article is based on Free Code Camp Basic Algorithm Scripting “Title Case a Sentence”.

Three ways you can find the largest number in an array using JavaScript

In this article, I’m going to explain how to solve Free Code Camp’s “Return Largest Numbers in Arrays” challenge. This…

If you have your own solution or any suggestions, share them below in the comments.

Or you can follow me on Medium, Twitter, Github and LinkedIn, right after you click the green heart below ;-)

‪#‎StayCurious‬, ‪#‎KeepOnHacking‬ & ‪#‎MakeItHappen‬!

Resources

  • Regular Expressions — MDN
  • toLowerCase() method — MDN
  • replace() — MDN
  • split() method — MDN
  • reverse() method — MDN
  • join() method — MDN
  • String.length — MDN
  • for — MDN