Zwei Möglichkeiten, in JavaScript nach Palindromen zu suchen

Dieser Artikel basiert auf dem Free Code Camp Basic Algorithm Scripting „Auf Palindrome prüfen“.

Ein Palindrom ist ein Wort, eine Phrase, eine Zahl oder eine andere Folge von Zeichen, die das gleiche vorwärts oder rückwärts lesen. Das Wort "Palindrom" wurde erstmals im 17. Jahrhundert vom englischen Dramatiker Ben Jonson aus den griechischen Wurzeln Palin ("wieder") und Dromos ("Weg, Richtung") geprägt. - src. Wikipedia

In diesem Artikel werde ich zwei Ansätze erläutern, erstens mit integrierten Funktionen und zweitens mit einer for-Schleife.

Algorithmus-Herausforderung

Geben Sie true zurück, wenn die angegebene Zeichenfolge ein Palindrom ist. Andernfalls geben Sie false zurück.

Ein Palindrom ist ein Wort oder ein Satz, der sowohl vorwärts als auch rückwärts gleich geschrieben wird, wobei Interpunktion, Groß- und Kleinschreibung und Abstand ignoriert werden.

Hinweis. Sie müssen alle nicht alphanumerischen Zeichen (Interpunktion, Leerzeichen und Symbole) entfernen und alles in Kleinbuchstaben umwandeln, um nach Palindromen zu suchen.

Wir werden Strings mit unterschiedlichen Formaten übergeben, wie z. B. "Racecar", "RaceCar" und "Race CAR".

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

Bereitgestellte Testfälle

  • Palindrom ("Rennwagen") sollte wahr zurückgeben
  • Palindrom („kein Palindrom“)sollte false zurückgeben
  • Palindrom ("Ein Mann, ein Plan, ein Kanal. Panama") sollte wahr zurückkehren
  • Palindrom ("nie ungerade oder gerade") sollte true zurückgeben
  • Palindrom ("Nein") sollte false zurückgeben
  • Palindrom ("fastomla") sollte false zurückgeben
  • Palindrom ("Mein Alter ist 0, 0 si ega ym.") sollte true zurückgeben
  • Palindrom ("1 Auge für 1 Auge") sollte false zurückgeben
  • Palindrom ("0_0 (: / - \ :) 0–0") sollte true zurückgeben

Welchen regulären Ausdruck benötigen wir, um den letzten Testfall zu bestehen?

Reguläre Ausdrücke sind Muster, mit denen Zeichenkombinationen in Zeichenfolgen abgeglichen werden.

Wenn die Suche nach einer Übereinstimmung mehr als eine direkte Übereinstimmung erfordert, enthält das Muster Sonderzeichen.

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

\ W entfernt alle nicht alphanumerischen Zeichen :

  • \ W entspricht einem beliebigen Nicht-Wort-Zeichen
  • \ W entspricht [^ A-Za-z0–9_]
  • \ W stimmt mit allem überein, was nicht in den Klammern steht

Was bedeutet das?

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

In unserem Testfall benötigen wir jedoch ein Palindrom („ 0_0 (: / - \ :) 0–0 “), um true zurückzugeben , was bedeutet, dass „ _ (: / - \ :) - “ übereinstimmen muss.

Wir müssen " _ " hinzufügen , um diesen speziellen Testfall zu bestehen.

We now have “\W_”

Wir müssen auch das g- Flag für die globale Suche hinzufügen .

We finally have “/[\W_]/g”
/ [\ W _] / g wurde zu rein demonstrativen Zwecken verwendet, um zu zeigen, wie RegExp funktioniert. / [^ A-Za-z0–9] / g ist das am einfachsten zu wählende RegExp .

1. Suchen Sie nach Palindromen mit integrierten Funktionen

Für diese Lösung verwenden wir verschiedene Methoden:

  • Die toLowerCase () -Methode, um den aufrufenden Zeichenfolgenwert zurückzugeben, der in Kleinbuchstaben konvertiert wurde.
  • Die replace () -Methode, um eine neue Zeichenfolge mit einigen oder allen Übereinstimmungen eines durch eine Ersetzung ersetzten Musters zurückzugeben. Wir werden eines der RegExp verwenden, die wir gerade erstellt haben.
  • Die split () -Methode teilt ein String-Objekt in ein Array von Strings auf, indem der String in Unterstrings unterteilt wird.
  • Die reverse () -Methode kehrt ein vorhandenes Array um. Das erste Array-Element wird zum letzten und das letzte zum ersten.
  • Die join () -Methode verbindet alle Elemente eines Arrays zu einer Zeichenfolge.
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");

Ohne Kommentare:

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. Suchen Sie mit einer FOR-Schleife nach Palindromen

Die Halbindizierung (len / 2) hat Vorteile bei der Verarbeitung großer Zeichenfolgen. Wir überprüfen das Ende jedes Teils und teilen die Anzahl der Iterationen innerhalb der FOR-Schleife durch zwei.

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

Ohne Kommentare:

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

Ich hoffe, Sie fanden das hilfreich. Dies ist Teil meiner Artikelserie „Wie man FCC-Algorithmen löst“ zu den Herausforderungen des Free Code Camp-Algorithmus, in der ich verschiedene Lösungen vorschlage und Schritt für Schritt erkläre, was unter der Haube passiert.

Zwei Möglichkeiten, um das Ende eines Strings in JavaScript zu bestätigen

In diesem Artikel werde ich erklären, wie Sie die Herausforderung „Confirm the Ending“ von freeCodeCamp lösen können.

Drei Möglichkeiten, einen String in JavaScript umzukehren

Dieser Artikel basiert auf dem Free Algorithmus Camp Basic Algorithm Scripting „Reverse a String“.

Drei Möglichkeiten, eine Zahl in JavaScript zu faktorisieren

Dieser Artikel basiert auf dem Free Algorithmus Camp Basic Algorithm Scripting „Factorialize a Number“.

Drei Möglichkeiten, das längste Wort in einer Zeichenfolge in JavaScript zu finden

Dieser Artikel basiert auf dem Free Algorithmus Camp Basic Algorithm Scripting „Finde das längste Wort in einer Zeichenfolge“.

Drei Möglichkeiten, einen Satz in JavaScript zu betiteln

Dieser Artikel basiert auf dem Free Algorithmus Camp Basic Algorithm Scripting „Title Case a Satz“.

Drei Möglichkeiten, wie Sie mit JavaScript die größte Anzahl in einem Array finden können

In diesem Artikel werde ich erklären, wie die Herausforderung „Größte Zahlen in Arrays zurückgeben“ von Free Code Camp gelöst werden kann. Dies…

Wenn Sie eine eigene Lösung oder Vorschläge haben, teilen Sie diese unten in den Kommentaren mit.

Oder du kannst mir auf Medium , Twitter, Github und LinkedIn folgen , gleich nachdem du auf das grüne Herz unten geklickt hast ;-)

# StayCurious, # KeepOnHacking & # MakeItHappen!

Ressourcen

  • Reguläre Ausdrücke - MDN
  • toLowerCase () -Methode - MDN
  • replace () - MDN
  • split () -Methode - MDN
  • reverse () Methode - MDN
  • join () -Methode - MDN
  • String.length - MDN
  • für - MDN