To måder at kontrollere palindromer i JavaScript

Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting “Check for Palindromes”.

En palindrom er et ord, en sætning, et tal eller en anden rækkefølge af tegn, der læser det samme baglæns eller fremad. Ordet "palindrom" blev først opfundet af den engelske dramatiker Ben Jonson i det 17. århundrede, fra de græske rødder palin ("igen") og dromos ("vej, retning"). - src. Wikipedia

I denne artikel vil jeg forklare to tilgange, først med indbyggede funktioner og anden ved hjælp af en for-loop.

Algoritmeudfordring

Returner sandt, hvis den givne streng er et palindrom. Ellers returner falsk.

En palindrom er et ord eller en sætning, der er stavet på samme måde både fremad og bagud, og ignorerer tegnsætning, store bogstaver og afstand.

Bemærk. Du bliver nødt til at fjerne alle ikke-alfanumeriske tegn (tegnsætning, mellemrum og symboler) og dreje alt med små bogstaver for at kontrollere palindromer.

Vi videregiver strenge med forskellige formater, såsom “racerbil”, “RaceCar” og “race CAR” blandt andre.

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

Medfølgende testtilfælde

  • palindrome ("racerbil") skal vende tilbage sandt
  • palindrom (“ikke et palindrom”)skal returnere falsk
  • palindrom ("En mand, en plan, en kanal. Panama") skal vende tilbage
  • palindrom ("aldrig ulige eller lige") skal vende tilbage til sandt
  • palindrom ("nej") skal returnere falsk
  • palindrome (“næstenomla”) skal returnere falsk
  • palindrome (“Min alder er 0, 0 si ega ym.”) skal være sand
  • palindrom ("1 øje ​​for 1 øje.") skal returnere falsk
  • palindrome (“0_0 (: / - \ :) 0–0”) skal returnere true

Hvilket regulært udtryk skal vi have for at bestå den sidste test case?

Regulære udtryk er mønstre, der bruges til at matche tegnkombinationer i strenge.

Når søgningen efter et match kræver mere end et direkte match, indeholder mønsteret specialtegn.

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

\ W fjerner alle ikke-alfanumeriske tegn :

  • \ W matcher ethvert tegn, der ikke er ord
  • \ W svarer til [^ A-Za-z0–9_]
  • \ W matcher alt, hvad der ikke er lukket i parentes

Hvad betyder det?

[^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 _

Men i vores testtilfælde har vi brug for palindrome (“ 0_0 (: / - \ :) 0–0 ”) for at returnere true , hvilket betyder at “ _ (: / - \:) - ” skal matches.

Vi bliver nødt til at tilføje “ _ ” for at bestå denne specifikke testtilfælde.

We now have “\W_”

Vi bliver også nødt til at tilføje g- flag til global søgning.

We finally have “/[\W_]/g”
/ [\ W _] / g blev brugt til rent demonstrativt formål for at vise, hvordan RegExp fungerer. / [^ A-Za-z0–9] / g er den nemmeste RegExp at vælge .

1. Kontroller for palindromer med indbyggede funktioner

Til denne løsning bruger vi flere metoder:

  • Metoden toLowerCase () til at returnere den kaldende strengværdi konverteret til små bogstaver.
  • Metoden erstat () for at returnere en ny streng med nogle eller alle matches i et mønster erstattet af en erstatning. Vi bruger en af ​​RegExp, vi lige har oprettet tidligere.
  • Metoden split () opdeler et strengobjekt i en række strenge ved at adskille strengen i understrenge.
  • Metoden reverse () vender en matrix på plads. Det første array-element bliver det sidste, og det sidste bliver det første.
  • Metoden join () forbinder alle elementerne i en matrix til en streng.
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");

Uden kommentarer:

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. Kontroller for palindromer med FOR-loop

Halvindeksering (len / 2) har fordele ved behandling af store strenge. Vi kontrollerer slutningen fra hver del og deler antallet af iterationer inde i FOR-sløjfen med to.

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");

Uden kommentarer:

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");

Jeg håber, du fandt dette nyttigt. Dette er en del af min "How to Solve FCC Algorithms" -serie om artikler om Free Code Camp Algorithm Challenges, hvor jeg foreslår flere løsninger og forklarer trin for trin, hvad der sker under emhætten.

To måder at bekræfte afslutningen på en streng i JavaScript

I denne artikel forklarer jeg, hvordan man løser freeCodeCamp's "Confirm the Ending" -udfordring.

Tre måder at vende en streng i JavaScript

Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting “Vend en streng”

Tre måder at faktorisere et nummer i JavaScript

Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting “Faktoriser et tal”

Tre måder at finde det længste ord i en streng i JavaScript

Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting "Find det længste ord i en streng".

Tre måder at betegne sag på en sætning i JavaScript

Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting "Titel sag en sætning".

På tre måder kan du finde det største tal i en matrix ved hjælp af JavaScript

I denne artikel vil jeg forklare, hvordan man løser Free Code Camps "Returner største numre i arrays" -udfordring. Dette…

Hvis du har din egen løsning eller forslag, så del dem nedenfor i kommentarerne.

Eller du kan følge mig på Medium , Twitter, Github og LinkedIn lige efter at du har klikket på det grønne hjerte nedenfor ;-)

# StayCurious, # KeepOnHacking & # MakeItHappen!

Ressourcer

  • Regulære udtryk - MDN
  • toLowerCase () metode - MDN
  • udskift () - MDN
  • split () metode - MDN
  • reverse () metode - MDN
  • join () metode - MDN
  • Strenglængde - MDN
  • til - MDN