Palindrome هو نص أو رقم أو تسلسل تكون قراءته من البداية إلى النهاية مماثلة لقراءته من النهاية إلى البداية.
أمثلة:
racecar
level
madam
1221
بينما:
hello
algorithm
1234
ليست Palindrome.
تعد هذه المسألة مثالاً ممتازاً لتعلم تقنية Two Pointers.
الطريقة البسيطة: Reverse
يمكن عكس النص ومقارنته بالأصل:
function isPalindrome(value: string): boolean {
const reversed = value.split("").reverse().join("");
return value === reversed;
}
التعقيد:
Time: O(n)
Space: O(n)
لأننا ننشئ نسخة جديدة من النص.
Two Pointers
نضع Pointer في بداية النص وآخر في نهايته:
r a c e c a r
↑ ↑
L R
نقارن القيمتين ثم نتحرك نحو المركز.
left++
right--
إذا ظهر اختلاف واحد فالنتيجة false.
function isPalindrome(value: string): boolean {
let left = 0;
let right = value.length - 1;
while (left < right) {
if (value[left] !== value[right]) {
return false;
}
left++;
right--;
}
return true;
}
التعقيد:
Time: O(n)
Space: O(1)
تجاهل المسافات والرموز
مثال مشهور:
A man, a plan, a canal: Panama
بعد تحويل الحروف إلى lowercase وإزالة الرموز يصبح:
amanaplanacanalpanama
وهو Palindrome.
يمكن أيضاً تحريك Pointerين وتجاوز الأحرف غير الأبجدية والرقمية مباشرة دون إنشاء String جديد.
الأرقام
أعداد مثل:
121
1221
4554
Palindrome أيضاً.
يمكن تحويل الرقم إلى String أو قلب أرقامه رياضياً ثم المقارنة مع الرقم الأصلي.
function isNumberPalindrome(value: number): boolean {
if (value < 0) return false;
const original = value;
let reversed = 0;
while (value > 0) {
const digit = value % 10;
reversed = reversed * 10 + digit;
value = Math.floor(value / 10);
}
return original === reversed;
}
Recursion
يمكن حل المسألة Recursively أيضاً عن طريق مقارنة الطرفين ثم الانتقال للجزء الداخلي.
لكن هذا يحتاج إلى Call Stack، ولذلك تكون مساحة الذاكرة عادة O(n) مقارنة بـ O(1) في الحل التكراري.
Almost Palindrome
من الأسئلة الشائعة:
هل يمكن جعل النص Palindrome بحذف حرف واحد فقط؟
مثلاً:
abca
عند أول mismatch يمكن تجربة حذف الحرف الأيسر أو الأيمن ثم فحص الجزء المتبقي.
تطبيقات ومشكلات مرتبطة
تظهر فكرة Palindrome في مسائل مثل:
- Longest Palindromic Substring
- Palindromic Subsequence
- Palindrome Partitioning
- Valid Palindrome
- Minimum Insertions
كما أنها من أبسط الأمثلة على Two Pointers، وهي تقنية تستخدم أيضاً في Arrays وPair Sum وPartitioning وغيرها.
Case Sensitivity
قد يكون:
Level
غير Palindrome عند المقارنة Case-sensitive، لكنه يصبح:
level
بعد Normalization.
لذلك يجب تحديد قواعد المقارنة مسبقاً.
سؤال مقابلات شائع
قد يُطلب تجاهل المسافات والرموز وحالة الأحرف.
الحل الجيد يستخدم:
Two Pointers
Skip invalid characters
Case-insensitive comparison
بتعقيد:
Time: O(n)
Space: O(1)
حالات خاصة
"" → true
"a" → true
"aa" → true
"ab" → false
"racecar" → true
الخلاصة
Palindrome هو تسلسل متناظر من الجهتين، والطريقة القياسية لفحصه هي Two Pointers.
Time Complexity: O(n)
Space Complexity: O(1)
أهمية المسألة ليست فقط في اكتشاف الكلمات المتناظرة، بل في تعليم التفكير المتناظر وتقنية Two Pointers وإدارة Edge Cases بكفاءة.