JavaScriptでパリンドロームをチェックする2つの方法

この記事は、Free Code Camp Basic AlgorithmScripting「CheckforPalindromes」に基づいています。

回文は、単語、句、数字、または同じ文字を逆方向または順方向に読み取るその他の文字シーケンスです。「パリンドローム」という言葉は、17世紀にイギリスの劇作家ベン・ジョンソンによって、ギリシャ語のルーツであるパリン(「再び」)とドロモス(「道、方向」)から最初に造られました。- SRC。ウィキペディア

この記事では、2つのアプローチについて説明します。1つは組み込み関数を使用する方法、もう1つはforループを使用する方法です。

アルゴリズムの課題

指定された文字列が回文である場合はtrueを返します。それ以外の場合は、falseを返します。

回文は、句読点、大文字と小文字、および間隔を無視して、前後に同じように綴られる単語または文です。

注意。回文をチェックするには、英数字以外の文字(句読点、スペース、記号)をすべて削除し、すべて小文字にする必要があります。

「racecar」、「RaceCar」、「raceCAR」などのさまざまな形式の文字列を渡します。

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

提供されたテストケース

  • 回文(「レースカー」)はtrueを返す必要があります
  • 回文(「回文ではない」)falseを返す必要があります
  • 回文(「男、計画、運河。パナマ」)はtrueを返す必要があります
  • 回文(「奇数でも偶数でもない」)はtrueを返す必要があります
  • 回文(「nope」)はfalseを返す必要があります
  • 回文(「almostomla」)はfalseを返す必要があります
  • 回文(「私の年齢は0、0 si ega ym。」)はtrueを返す必要があります
  • 回文(「1つの目のうち1つの目」)はfalseを返す必要があります
  • palindrome(“ 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 _

ただし、テストケースでは、trueを返すためにpalindrome(“ 0_0(:/-\ :) 0–0 ”)が必要です。つまり、“ _(:/-\ :) ”が一致する必要があります。

この特定のテストケースに合格するには、「_」を追加する必要があります。

We now have “\W_”

また、グローバル検索用にgフラグを追加する必要があります。

We finally have “/[\W_]/g”
/ [\ W _] / gは、RegExpがどのように機能するかを示すための純粋な説明目的で使用されました。/ [^ A-Za-z0–9] / gは、選択するのが最も簡単な正規表現です。

1.機能が組み込まれたパリンドロームを確認します

このソリューションでは、いくつかの方法を使用します。

  • toLowerCaseメソッド()を呼び出す文字列値を返すメソッドは、小文字に変換されます。
  • 置き換え()メソッドは、いくつかまたは置換によって置き換えられたパターンのすべての一致を持つ新しい文字列を返します。先ほど作成した正規表現の1つを使用します。
  • スプリット()メソッドは、サブ文字列に文字列を分離することにより、文字列の配列に文字列オブジェクトを分割します。
  • 逆()メソッドは、代わりの配列を反転させます。最初の配列要素が最後になり、最後が最初になります。
  • 参加()メソッドは、文字列に、アレイのすべての要素を結合します。
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ループ内の反復回数を2で割ります。

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

I hope you found this helpful. This is part of my “How to Solve FCC Algorithms” series of articles on the Free Code Camp Algorithm Challenges, where I propose several solutions and explain step-by-step what happens under the hood.

Two ways to confirm the ending of a String in JavaScript

In this article, I’ll explain how to solve freeCodeCamp’s “Confirm the Ending” challenge.

Three Ways to Reverse a String in JavaScript

This article is based on Free Code Camp Basic Algorithm Scripting “Reverse a String”

Three Ways to Factorialize a Number in JavaScript

This article is based on Free Code Camp Basic Algorithm Scripting “Factorialize a Number”

Three Ways to Find the Longest Word in a String in JavaScript

This article is based on Free Code Camp Basic Algorithm Scripting “Find the Longest Word in a String”.

Three Ways to Title Case a Sentence in 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