طريقتان للتحقق من وجود Palindromes في JavaScript

تستند هذه المقالة إلى البرمجة النصية لخوارزمية Free Code Camp الأساسية "التحقق من وجود Palindromes".

المتماثل هو كلمة أو عبارة أو رقم أو تسلسل آخر من الأحرف التي تقرأ نفس الشيء للخلف أو للأمام. صاغ الكاتب المسرحي الإنجليزي بن جونسون كلمة "palindrome" لأول مرة في القرن السابع عشر ، من الجذور اليونانية palin ("مرة أخرى") و dromos ("الطريق ، الاتجاه"). - src. ويكيبيديا

في هذه المقالة ، سأشرح طريقتين ، الأولى مع الوظائف المضمنة والثانية باستخدام حلقة for.

تحدي الخوارزمية

إرجاع صحيح إذا كانت السلسلة المحددة متناظرة. خلاف ذلك ، قم بإرجاع خطأ.

المتناظرة هي كلمة أو جملة يتم تهجئتها بنفس الطريقة للأمام والخلف ، مع تجاهل علامات الترقيم ، والحالة ، والتباعد.

ملحوظة. ستحتاج إلى إزالة جميع الأحرف غير الأبجدية الرقمية (علامات الترقيم والمسافات والرموز) وقلب كل شيء بأحرف صغيرة من أجل التحقق من المتجانسات.

سنمرر سلاسل بتنسيقات مختلفة ، مثل "racecar" و "RaceCar" و "Race CAR" وغيرها.

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

حالات الاختبار المقدمة

  • يجب أن تعود الألوان المتناظرة ("سيارة السباق") إلى الوضع الصحيح
  • متناظرة ("ليست متناظرة")يجب أن يعود خطأ
  • المناظرة ("رجل ، خطة ، قناة. بنما") يجب أن تعود صحيحة
  • يجب أن يعود التناظر ("ليس فرديًا أو زوجيًا أبدًا") صحيحًا
  • يجب أن يعرض متناظرة ("لا") خطأ
  • يجب أن يعود متناظرة ("almostomla") خطأ
  • متناظرة ("عمري هو 0 ، 0 si ega ym.") يجب أن يعود صحيح
  • المتناظرة ("عين واحدة لعين واحدة") يجب أن تعود كاذبة
  • يجب أن يعود palindrome (“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. تحقق من وجود Palindromes مع الوظائف المضمنة

بالنسبة لهذا الحل ، سنستخدم عدة طرق:

  • و toLowerCase () طريقة لإرجاع قيمة سلسلة يدعو تحويلها إلى أحرف صغيرة.
  • ل تحل محل () طريقة للعودة سلسلة جديدة مع بعض أو جميع المباريات من نمط يحل محله بديل. سنستخدم أحد RegExp الذي أنشأناه للتو في وقت سابق.
  • و انقسام () طريقة تقسيم كائن سلسلة إلى صفيف سلاسل من خلال فصل السلسلة إلى سلاسل فرعية.
  • على العكس () طريقة عكس صفيف في المكان. يصبح عنصر المصفوفة الأول هو الأخير ويصبح الأخير هو الأول.
  • و انضمام () طريقة ينضم جميع عناصر المصفوفة إلى سلسلة.
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. تحقق من وجود Palindromes مع حلقة 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

تستند هذه المقالة إلى البرمجة النصية لخوارزمية Free Code Camp الأساسية "عكس سلسلة"

ثلاث طرق لتحليل رقم في JavaScript

تستند هذه المقالة إلى البرمجة النصية لخوارزمية Free Code Camp الأساسية "تحويل رقم إلى عوامل"

ثلاث طرق للعثور على أطول كلمة في سلسلة في JavaScript

تستند هذه المقالة إلى البرمجة النصية لخوارزمية Free Code Camp الأساسية "العثور على أطول كلمة في سلسلة".

ثلاث طرق لعنوان الحالة جملة في JavaScript

تستند هذه المقالة إلى البرمجة النصية لخوارزمية Free Code Camp الأساسية "حالة العنوان جملة".

ثلاث طرق يمكنك من خلالها إيجاد أكبر رقم في مصفوفة باستخدام JavaScript

في هذه المقالة ، سأشرح كيفية حل تحدي "إرجاع أكبر الأرقام في المصفوفات" في Free Code Camp. هذه…

إذا كان لديك الحل الخاص بك أو أي اقتراحات ، فشاركها أدناه في التعليقات.

أو يمكنك متابعتي على Medium و Twitter و Github و LinkedIn ، مباشرة بعد النقر فوق القلب الأخضر أدناه ؛-)

# StayCurious ، # KeepOnHacking و # MakeItHappen!

مصادر

  • التعبيرات العادية - MDN
  • طريقة toLowerCase () - MDN
  • استبدل () - MDN
  • طريقة الانقسام - MDN
  • الطريقة العكسية - MDN
  • طريقة الانضمام - MDN
  • طول السلسلة - MDN
  • لـ - MDN